Android中Js與java的交互

    在最近項目開發中頻繁用到Js與Java的交互,今天把相關知識點整理出來,歡迎你們吐槽。啪啪啪~ javascript

一、Js調用Java中的方法: 
    a、對WebView進行設置

mWebView.addJavascriptInterface(new DmJavaScriptInterface(),"androidObject");

    在Js中androidObject就是DmJavaScriptInterface的一個對象,經過這個對象能夠調用類中的相關方法 java

    b、實現DmJavaScriptInterface類

  final class DmJavaScriptInterface {
        DmJavaScriptInterface() {
        }        @JavascriptInterface        
        public void getPhoto() {
            Log.e(TAG,"js調用原生方法");
            LsUIHelper.getInstance().showLsChoosePicListActivity(mContext, 13);
        }        @JavascriptInterface        
        public String getToken() {
            String token = getUserToken(mContext);  
           // Log.e(TAG, "getToken token :=" + token);    
            return token;
        }        @JavascriptInterface
        public void finishSubmit() {
            LsFeedbackListActivity.this.finish();
        }

    }

    在Js中經過androidObject.getPhoto(),androidObject.getToken(),androidObject.finishSubmit()就能夠實現調用Java端的方法。 android

二、Java調用Js方法 

基本格式:webView.loadUrl("javascript:sayHello()"); 
根據是否有參數和是否有返回值能夠分爲如下幾類(sayHello()爲Js中被調用的方法名): 

a、無參數無返回值

String call = "javascript:satHello()";
webView.loadUrl(call);

b、有參數無返回值

String str = "你好";
String call = "javascript:satHello(\""+str+"\")";
webView.loadUrl(call);

c、有參數有返回值 

    這類比較特殊,得分兩種狀況。在Android4.4以前不提供調用Js函數並獲取返回值的方法。解決辦法是先讓java調用Js的方法(有參數無返回值),而後Js在改方法中回調Java的方法,並將結果做爲參數傳遞給Java的方法。相關代碼以下: web

一、Java調用Js方法

String str = "你好";
String call = "javascript:satHello(\""+str+"\")";
webView.loadUrl(call);

二、Js中調用Java的方法:

Function sayhello(str) {
    Window.androidObject.onResultContent(「hello」);
}

三、Java在回調方法中獲取Js函數的返回值

@JavascriptInterface
public void onResultContent(int result) {  
    Log.i(LOGTAG, "onResultContentresult=" + result);
}

Android4.4以後使用evaluateJavascript便可 ide

Js端的方法:

function getGreetings() {     
 return 1;
 }

Java端代碼

private void testEvaluateJavascript(WebView webView) {        
  webView.evaluateJavascript("getGreetings()", new ValueCallback<String>() {  
   @Override 
   public void onReceiveValue(String value) {     
       Log.i(LOGTAG, "onReceiveValue value=" + value); 
         }
    });
}
相關文章
相關標籤/搜索