• native <互相调用> js


    WebView

    WebView 提供了这些方法

    - 提供了这些方法

    
    ```
    addJavascriptInterface
    canGoBack
    canGoBackOrForward
    canGoForward
    capturePicture
    clearCache
    clearFormData
    clearHistory
    clearSslPreferences
    clearView
    destroy
    disablePlatformNotifications
    documentHasImages
    enablePlatformNotifications
    findAddress
    getContentHeight
    getFavicon
    getHttpAuthUsernamePassword
    getProgress
    getScale
    getTitle
    getUrl
    getZoomControls
    goBack
    goBackOrForward
    goForward
    invokeZoomPicker
    loadData
    loadDataWithBaseURL
    loadUrl
    overlayHorizontalScrollbar
    overlayVerticalScrollbar
    pageDown
    pageUp
    pauseTimers
    reload
    requestFocusNodeHref
    requestImageRef
    resumeTimers
    savePassword
    setDownloadListener
    setHorizontalScrollbarOverlay
    setHttpAuthUsernamePassword
    setInitialScale
    setVerticalScrollbarOverlay
    setWebChromeClient
    setWebViewClient
    stopLoading
    zoomIn
    zoomOut
    ```
    
    # 1 SetWebViewClient和 SetWebChromeClient的区别

    仅仅是渲染一个HTML网页,只需要用setWebViewClient就可以了,但是如果要处理比较复杂的事务,就考虑用setWebChromeClient辅助WebView处理JavaScript的对话框,网站图标,网站title,加载进度等.

    https://blog.csdn.net/u014473112/article/details/52176412

    WebChromeClient

    
    WebView articleContentWebView = new WebView(this);
    articleContentWebView.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    });
    

    WebViewClient

    WebView articleContentWebView = new WebView(this);
    articleContentWebView.setWebChromeClient(new WebChromeClient(){
      @Override
      public void onProgressChanged(WebView view, int newProgress) {
        super.onProgressChanged(view, newProgress);
      }
    });
    

    2 native 调用 js

    网页JS供java调用的代码

    <script type="text/javascript">
      function funWithoutParam(){
    		document.getElementById("appId").innerHTML = "native 调用 js"
      }
      function funWithParam(param){
    		document.getElementById("appId").innerHTML = "native 调用 js 的参数: " + param
      }
    </script>
    

    java 端的代码

    WebView webView = new WebView(this);
    articleContentWebView.getSettings().setJavaScriptEnabled(true);
    
    Button = btn = findViewById(R.id.btn);
    btn.setOnCLickListener((View v)->{
    	webView.loadUrl("javascript:funWithoutParam");
      String param = "native param"
    	webView.loadUrl("javascript:funWithoutParam(" + param + ")");
    });
    
    //articleContentWebView.loadDataWithBaseURL(null,"ture HTML DOCS","text/html","UTF-8",null);
    //articleContentWebView.loadData("ture HTML DOCS","text/html","UTF-8");
    

    Webview 对象通过 loadUrl 接口来加载以 javascript 协议头的方式,就可以调用JS中定义的接口了。

    3 js 调用native

    java 端代码

    WebView webView = new WebView(this);
    // 启用js
    wenView.getSettings().setJavaScriptEnabled(true); 
    // 加载本地网页 ture HTML DOCS
    articleContentWebView.loadData("ture HTML DOCS","text/html","UTF-8");
    // 注入对象
    mMCWebInterface = new MCWebInterface(activity, webview);  
    webview.addJavascriptInterface(mMCWebInterface, "MCWebInterface");
    
    • mMCWebInterface: 供给 js 调用的对象

    • "MCWebInterface": js 调用 native 对象时使用的名字

    网页 js 端代码

    <div>
    	<button onClick="window.MCWebInterface.invokeStart('this is param')">
      	点击调用 native 代码
      </button>
    </div>
    

    4 注意

    需要注意的是在Android4.2之前addJavascriptInterface接口存在注入漏洞,即JS可以通过反射获取到native端的其他接口,进行其他非法操作,所以4.2之后升级增加了JS只能访问带有 @JavascriptInterface注解的Java函数的限制,在本地定义的提供给JS调用的接口都需要增加@android.webkit.JavascriptInterface声明。

    直接让小于4.2版本的系统不起作用

    @SuppressLint("JavascriptInterface")
    @Override
    public void addJavascriptInterface(Object object, String name) {
      if (Build.VERSION.SDK_INT >= 17) {
        super.addJavascriptInterface(object, name);
      }
    }
    

    供给JS调用的接口增加@JavascriptInterface声明。

    在本地定义的提供给JS调用的接口都需要增加@android.webkit.JavascriptInterface声明。

  • 相关阅读:
    布尔值数据类型
    数据类型
    while循环。for循环
    对于元素类型为集合的List进行排序
    进程和线程之由来
    ExecutorService的关闭
    Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
    什么是设计模式
    java多线程的原子性
    OutputStream的flush()方法
  • 原文地址:https://www.cnblogs.com/sunupo/p/16647567.html
Copyright © 2020-2023  润新知