AndroidJS相互呼叫詳解

進階的玄武發表於2015-10-29
版權宣告:本文為博主原創文章,轉載請標明出處。 https://blog.csdn.net/lyhhj/article/details/49497227

Android JS相互呼叫詳解

最近在研究Android、JS相互呼叫,之前沒怎麼接觸過,只知道loadUrl()就可以載入一個網頁了,研究過之後發現Android可以調JS,JS也可以調Android原生控制元件,很開心啊。下面小編就開始嘍:
原理就是Java和JS呼叫,在Android中是通過WebView來實現的。

下面先說一下簡單的Android和JS相互呼叫
首先通過loadurl()來載入網頁
WebView開啟JS指令碼執行
Android端提供JS呼叫的互動介面
簡單的看一下程式碼:

mWebView=(MyWebView)findViewById(R.id.wv_container_information);
        mWebSetting = mWebView.getSettings();
        mWebSetting.setJavaScriptEnabled(true);
//js呼叫Android中的方法
        mWebView.addJavascriptInterface(this, "XXX");//XXX未html中的方法
        /**
     * 客戶端提供send_comment方法被js呼叫
     * by:chenhe at:2015/09/28
     *
     * @param uuid     uuid
     * @param fun_name 呼叫的方法名
     * @param json     js給客戶端的json
     */
    @JavascriptInterface
    public void send_comment(final String uuid, final String fun_name, final String json) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                commend = CommandFactory.getInstance().createCommand(fun_name);
                if (commend != null) {
                    commend.setFun_name(fun_name);
                    commend.setmHandler(mHandler);
                    commend.setParam(json);
                    commend.setUuid(uuid);
                    commend.setWebView(mWebView);
                    commend.do_result(context);
                }
            }
        }).start();
    }

這裡通過mWebView.addJavascriptInterface()實現呼叫JS中的方法,也就是說第二個引數為網頁中的方法叫XXX();它裡面的引數則為我下面send_command();方法中的引數然後我再做一些操作。最後通過loadurl();就實現呼叫了。很簡答相信大家也都會用,也都用過,那麼下面給大家詳細介紹一下怎樣通過這樣的呼叫來實現JS呼叫Android端的一些控制元件。


步驟

首先JS呼叫客服端的某個方法,將需要的引數傳遞過來

然後客戶端根據JS的需求去執行相關操作

執行完操作之後回掉JS方法

具體實現

第一步就是上面所描述的過程

這裡省略了(其中fun_name就是JS要調的方法名字舉個例子:比如它想要客戶端實現彈出Dialog,那麼web端定義一個方法名為:popup.alert)

客服端通過方法名字來執行相關操作

通過方法名我們本地去彈出Dialog,或者根據伺服器返回的json資料來執行一些其他複雜的操作,我這裡就不具體說明了,可以有很多,比如開啟通訊錄選擇聯絡人、獲取手機唯一識別符號、設定導航欄、、彈出日期選擇框等等。

執行完相關操作再回撥JS的方法將資訊返回給JS

比如上面的開啟通訊錄選擇聯絡人之後我們可以將聯絡人的手機號姓名等屬性通過Json返回給JS。
大體思路就是這樣,看一下程式碼:

“`
@JavascriptInterface
public void send_comment(final String fun_name, final String json) {

    //根據fun_name處理不同業務
    new Thread(new Runnable() {
        @Override
        public void run() {
            //注意此處必須是非同步處理
            JSONObject jsonObject = null;
            try {
                jsonObject = new JSONObject(json);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            String title = jsonObject.optString("title");
            String message = jsonObject.optString("message");
            //TODO:根據message執行相關操作
            Message msg = new Message();
            msg.what = 0;
            msg.obj = jsonObject;
            handler.senMessage(msg);
        }
    }).start();
}

/**
 * 回掉JS方法將處理資訊返回給JS
 * @param isSuccess
 * @param json
 */
public void returnToJs(final boolean isSuccess, final JSONObject json){
    Log.d("----", "javascript:app_result(`" + isSuccess + "`,`" + json.toString() + "`)");
            String data = "javascript:app_result(`" + isSuccess + "`,`" + json.toString() + "`)";
            webView.loadUrl(data);
}

private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if (msg.what==0){
            //TODO:執行相關操作
            returnToJs(true, (JSONObject) msg.obj);
        }
    }
};

這樣就實現了基本的JS調Android原生控制元件了,主要是和JS配合好就能完美實現了,現在好多的APP都用的這種方式來實現。所以說弄清楚這一塊很有必要,其實也沒什麼,說是JS呼叫Android,其實就是Android這邊提供一個java介面來loadurl()就可以。
因為小編是第一次用MD來編寫的部落格,所以說樣式上可能不太好看,請大家見諒。如果說這邊文章看的不太懂的話可以私聊小編,小編會給大家詳細講解的。
原始碼已經同步到我的GitHub上了
https://github.com/Hankkin/AndroidJSDemo/tree/master


相關文章