1. 程式人生 > >Android 與 h5 js互動問題,初步瞭解。

Android 與 h5 js互動問題,初步瞭解。

接觸Android也算很久了,但是js互動一直不熟也可以說是沒認真接觸過。今天專案修改也完成了,閒來無事忽然想起了這個問題,上網查找了一下,初步瞭解了一下。自己也寫了demo還算ok!

廢話不多說了,咱直接來說一下。(寫這個呢可能幫不到太多人,但是想讓自己印象深刻一些!)

首先,js互動分為兩種(Android基於webview操作):一、Android端觸發web端的事件;二、相反的,就是web中呼叫Android本地的方法。

我們接下來就分別說一下這兩種情況:

       1、Android端觸發web端的事件:我在程式碼裡呢寫了一個按鈕,實現了點選事件  

其中的onClick事件出發了點選事件,但是有一點我沒搞清楚就是,為什麼我在一個按鈕的話 通過id來分別呼叫兩個方法,沒成功。所以此處就用一個吧。在我們程式碼裡有一個方法是

//Android呼叫有返回值js方法
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public void onClick(View v) {
        //有返回值
        mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                Log.e(TAG, "onReceiveValue value=" + value);
                Toast.makeText(MyWebViewActivity.this,value,Toast.LENGTH_SHORT).show();
            }
        });

        //無返回值
//                mWebView.loadUrl("javascript:s()");
    }

此處就是詳細呼叫時的情況,在此處有兩種呼叫的方式,當呼叫方法有返回值時,或者沒有返回值。

sum(1,2)實在html檔案中自己寫的一個求和方法

function sum(a,b){
return a+b;
}
當然在實際開發中,這個具體方法還需要前段同時來辛苦一下子!

s()方法,是一個沒有返回值的方法,所以我們可以直接用以上的形式呼叫(具體方法程式碼是呼叫了我們本地自己寫的程式碼一會會說到。)

function s(){
var result =window.android.hello();
document.getElementById("p").innerHTML=result;
}

這樣的話,Android本地呼叫web的方法就成功了!

2、接下來說一下web呼叫Android本地的方法(此處很容易想到的例子就是當前段給我們一個web頁是有一個返回按鈕,但我們點選想讓他會出我們自己寫的activity時,結果出發的是他們web內部的方法,而沒有結束我們當前想關閉的activity)

先貼一下程式碼

WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JsInteration(), "android");

這個是webview的基礎配置,第二行是你要跟獲得跟js互動的許可權一定要有!

第三行呢,就是我們接下來要說的了 。很明顯  new JsInteration 是我們自己寫的一個class類,“android”這個標誌我認為是宣告一下是Android端吧。JsInteration的實現如下:

//h5呼叫本地方法
public class JsInteration {

    @JavascriptInterface
    public String hello() {
       return "hello word";
    }
    @JavascriptInterface
    public String hello11() {
        return "hello word11123";
    }

    @JavascriptInterface
    public void fin() {
        MyWebViewActivity.this.finish();
    }
}

這裡面有三個方法,共同點就是 @JavascriptInterface註釋!!這些方法,你可以自己隨便定義按照具體需求。此處就出現了剛才我說的要在下面說的那行程式碼:

var result =window.android.hello();

window.android.hello();就是呼叫了我們Android的方法,返回的值賦給了result。至於document.getElementById("p").innerHTML=result; 這行程式碼是h5中的程式碼,想我媳婦請教之後的值就是給一個“p”標籤賦值。太簡單。這樣一來我們通過

<button onclick="s()">呼叫本地方法</button>

h5中的這個方法就呼叫了

function s(){
var result =window.android.hello();
document.getElementById("p").innerHTML=result;
}

而這行程式碼又呼叫了我們寫在本地的hello()方法,這樣就呼叫成功了!!!

 

-----------------------------------------------------------------

寫一遍,自己以後對這個更熟悉了,也方便回頭嘲笑一下以前的自己。  哈哈,感覺自己寫完覺得好亂!!