天天看點

android 與 h5 互動1.使用原生的WebView2.使用agentWeb3.JsBridgeWebView(AgentWeb)與h5互調方案

現代的移動應用幾乎都是原生和h5混合開放,這樣既保證了使用者體驗,又使得APP在一定程度上具備動态更新能力,同時有利于實作跨平台開發,減少人力成本。混合開發自然避免不了app與h5的互動。今天我們就來談談android 和 h5 的互動。

1.使用原生的WebView

h5 調用 android

webView.getSetting().setJavaScriptEnabled(true);//讓webView支援js
webView.addJavaScriptInterface(new JSInterface(),"android");    //将JSInterface對象暴露給js,在js中可以通過  window.android通路到這個對象,其中JSInterface為内部類


public class JSInterface{

    /**
    * 提供給h5調用的方法必須是有@JavascriptInterface注解标注的,public修飾的方法
    * @ data h5傳給原生app的資料
    */
    @JavascriptInterface
    public void webToApp(String data){
    }
}
           

h5調用window.android.webToApp就能通路原生的webToApp方法了。

webView 調用 h5 的方法

webView.loadUrl(“javascript:”+JS方法名+”(app給h5傳送的資料)”);

2.使用agentWeb

agentWeb傳送門

h5 調用 AgentWeb

//JSInterface對象暴露給js,在js中可以通過   window.android通路到這個對象,其中JSInterface為内部類
agentWeb.getInterfaceHolder.addJavaObject("android",new JSInterface());

public class JSInterface{

    /**
    * 提供給h5調用的方法必須是有@JavascriptInterface注解标注的,public修飾的方法
    * @ data h5傳給原生app的資料
    */
    @JavascriptInterface
    public void method(String data){
    }
}
           

AgentWeb調用h5

3.JsBridge

JsBridge傳送門

h5調用android:

android端代碼
           
//建立androidMethod方法給h5調用,web傳回的參數為data,傳回function()
        webView.registerHandler("androidMethod", new BridgeHandler() {
            @Override
            /**
            * @data h5傳回給app的資料
            */
            public void handler(String data, CallBackFunction function) {
                function.onCallBack("androiddata");//app傳給h5的資料
            }

        });
           
//h5調用webView的方法
           window.WebViewJavascriptBridge.callHandler(
                'androidMethod'     //調用app的方法
                , {'param': '中文測試'} //傳給app的資料
                , function(responseData) {   //從app傳過來的資料
                    document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData
                }
            );
           

WebView(AgentWeb)與h5互調方案

Android端

public class JSInterface{

    //提供給h5調用的方法必須是有@JavascriptInterface注解标注的,public修飾的方法
    @JavascriptInterface
    public void webToApp(String data){
        JSONObject jsonObject = new JSONObject(data);
        String method = jsonObject.getString("method");
        swithch(method){
            case "finishActivity";
                finish();
                break;
            case "open":
                startActivity(new Intent(context,activity));
                break;
            case "getAndroidParams":
                String params = "toH5Params";
                agentWeb.getJsAccessEntra().quickCallJs("appToWeb",params);
                break;
        }
    }
}
           
在Android端隻寫一個webToApp給h5調用,h5調用webToApp的時候傳入相應的資料,Android解析資料data,根據data的不同進行不同的操作,舉個栗子上面的代碼中我們解析data後如果接收到的資料是finishActivity調用finish,h5需要Android的參數可以調用window.android.webToApp("{'method':'getAndroidParams'}"),然後我們就會調用agentWeb.getJsAccessEntra().quickCallJs("appToWeb",params);給web傳送參數
           

繼續閱讀