개발일지

Android in A..Z - WebView Bridge 본문

Android (안드로이드)

Android in A..Z - WebView Bridge

강태종 2021. 8. 5. 17:58

Bridge

Android에서 WebView를 통해 Android와 Web간의 통신을 도와주는 기능이다. WebView에 addJavascriptInterface 기능을 통해 JavaScript 구문을 넣을 수 있으며, loadUrl 기능을 통해 JavaScript 구문을 실행할 수 있다.


WebView

주의 사항 : 같은 이름으로 Bridge를 추가한 경우 기존의 Bridge가 제거된다.

@SuppressLint("SetJavaScriptEnabled")
class JavaScriptWebView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, defStyleRes: Int = 0) : WebView(context, attrs, defStyleAttr, defStyleRes) {
    private var isLoading = true
    private var callback: ((html: String) -> Unit)? = null

    init {
        settings.javaScriptEnabled = true
        webChromeClient = WebChromeClient()
        webViewClient = object : WebViewClient() {
            override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                super.onPageStarted(view, url, favicon)
                isLoading = true
            }

            override fun onPageFinished(view: WebView?, url: String?) {
                super.onPageFinished(view, url)
                isLoading = false
            }
        }

        addJavascriptInterface(object {
            @JavascriptInterface
            fun getHTMLCode(html: String) {
                Log.d(TAG, "getHTMLCode : $html")
                callback?.invoke(html)
            }
        }, "Bridge")
    }

    fun postGetHTMLCode(callback:(html: String) -> Unit) {
        if (isLoading) {
            Toast.makeText(context, "Loading try later", Toast.LENGTH_SHORT).show()
            return
        }

        this.callback = callback
        loadUrl("javascript:window.Bridge.getHTMLCode(document.getElementsByTagName('html')[0].innerHTML);")
    }
}
  • settings.javaScriptEnabled : WebView에서 JavaScript 사용을 허용한다.
  • WebChromeClient : 경고, 창닫기 등 브라우저 기능에 대한 함수들이 있다.
  • WebViewClient : 현재 페이지에서 일어나는 변동 사항을 알려주는 함수들이 있다. (웹 페이지 가로채기 등 다양한 기능을 수행할 수 있다.)
  • addJavascriptInterface : WebView에 JavaScript를 추가하는 함수이다. Class와 Name을 추가하는데 Class에서 @JavascriptInterface 붙은 함수만 추가된다.
  • loadUrl : URL을 불러오는 함수, `javascript:`를 통해서 JavaScript를 실행할 수 있다. (Bridge라는 이름의 Class로 getHTMLCode함수를 추가했으므로 window.Bridge.getHTMLCode를 호출한다.

Git (예제코드)

https://github.com/KangTaeJong98/Example/tree/main/Android/Bridge

 

'Android (안드로이드)' 카테고리의 다른 글

Android in A..Z - Intent  (0) 2021.08.30
Android In A..Z - Google API (Google Map)  (0) 2021.08.18
Android in A..Z - Flow  (0) 2021.08.05
Android in A..Z - Context  (0) 2021.08.05
Android in A..Z - Constraint Layout  (0) 2021.08.04
Comments