亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android中Java和JavaScript交互實例

2020-04-11 11:41:32
字體:
來源:轉載
供稿:網友

Android提供了一個很強大的WebView控件用來處理Web網頁,而在網頁中,JavaScript又是一個很舉足輕重的腳本。本文將介紹如何實現Java代碼和Javascript代碼的相互調用。

如何實現

實現Java和js交互十分便捷。通常只需要以下幾步。

1.WebView開啟JavaScript腳本執行
2.WebView設置供JavaScript調用的交互接口。
3.客戶端和網頁端編寫調用對方的代碼。

本例代碼

為了便于講解,先貼出全部代碼

Java代碼

復制代碼 代碼如下:

package com.example.javajsinteractiondemo;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class MainActivity extends Activity {
  private static final String LOGTAG = "MainActivity";
  @SuppressLint("JavascriptInterface")
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      final WebView myWebView = (WebView) findViewById(R.id.myWebView);
      WebSettings settings = myWebView.getSettings();
      settings.setJavaScriptEnabled(true);
      myWebView.addJavascriptInterface(new JsInteration(), "control");
      myWebView.setWebChromeClient(new WebChromeClient() {});
      myWebView.setWebViewClient(new WebViewClient() {

          @Override
          public void onPageFinished(WebView view, String url) {
              super.onPageFinished(view, url);
              testMethod(myWebView);
          }
         
      });
      myWebView.loadUrl("file:///android_asset/js_java_interaction.html");
  }
 
  private void testMethod(WebView webView) {
      String call = "javascript:sayHello()";
     
      call = "javascript:alertMessage(/"" + "content" + "/")";
     
      call = "javascript:toastMessage(/"" + "content" + "/")";
     
      call = "javascript:sumToJava(1,2)";
      webView.loadUrl(call);
     
  }
 
  public class JsInteration {
     
      @JavascriptInterface
      public void toastMessage(String message) {
          Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
      }
     
      @JavascriptInterface
      public void onSumResult(int result) {
          Log.i(LOGTAG, "onSumResult result=" + result);
      }
  }

}

前端網頁代碼

復制代碼 代碼如下:

<html>
<script type="text/javascript">
    function sayHello() {
        alert("Hello")
    }

    function alertMessage(message) {
        alert(message)
    }

    function toastMessage(message) {
        window.control.toastMessage(message)
    }

    function sumToJava(number1, number2){
       window.control.onSumResult(number1 + number2)
    }
</script>
Java-Javascript Interaction In Android
</html>

調用示例

js調用Java

調用格式為window.jsInterfaceName.methodName(parameterValues) 此例中我們使用的是control作為注入接口名稱。

復制代碼 代碼如下:

function toastMessage(message) {
  window.control.toastMessage(message)
}

function sumToJava(number1, number2){
   window.control.onSumResult(number1 + number2)
}

Java調用JS

webView調用js的基本格式為webView.loadUrl(“javascript:methodName(parameterValues)”)

調用js無參無返回值函數

復制代碼 代碼如下:

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

調用js有參無返回值函數

注意對于字符串作為參數值需要進行轉義雙引號。

復制代碼 代碼如下:

String call = "javascript:alertMessage(/"" + "content" + "/")";
webView.loadUrl(call);

調用js有參數有返回值的函數

Android在4.4之前并沒有提供直接調用js函數并獲取值的方法,所以在此之前,常用的思路是 java調用js方法,js方法執行完畢,再次調用java代碼將值返回。

1.Java調用js代碼

復制代碼 代碼如下:

String call = "javascript:sumToJava(1,2)";
webView.loadUrl(call);

2.js函數處理,并將結果通過調用java方法返回

復制代碼 代碼如下:

function sumToJava(number1, number2){
       window.control.onSumResult(number1 + number2)
}

3.Java在回調方法中獲取js函數返回值

復制代碼 代碼如下:

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

4.4處理

Android 4.4之后使用evaluateJavascript即可。這里展示一個簡單的交互示例 具有返回值的js方法

復制代碼 代碼如下:

function getGreetings() {
      return 1;
}

java代碼時用evaluateJavascript方法調用

復制代碼 代碼如下:

private void testEvaluateJavascript(WebView webView) {
  webView.evaluateJavascript("getGreetings()", new ValueCallback<String>() {

  @Override
  public void onReceiveValue(String value) {
      Log.i(LOGTAG, "onReceiveValue value=" + value);
  }});
}

輸出結果

復制代碼 代碼如下:

I/MainActivity( 1432): onReceiveValue value=1

注意

1.上面限定了結果返回結果為String,對于簡單的類型會嘗試轉換成字符串返回,對于復雜的數據類型,建議以字符串形式的json返回。
2.evaluateJavascript方法必須在UI線程(主線程)調用,因此onReceiveValue也執行在主線程。

疑問解答

Alert無法彈出

你應該是沒有設置WebChromeClient,按照以下代碼設置

復制代碼 代碼如下:

myWebView.setWebChromeClient(new WebChromeClient() {});
Uncaught ReferenceError: functionName is not defined

問題出現原因,網頁的js代碼沒有加載完成,就調用了js方法。解決方法是在網頁加載完成之后調用js方法

復制代碼 代碼如下:

myWebView.setWebViewClient(new WebViewClient() {

  @Override
  public void onPageFinished(WebView view, String url) {
      super.onPageFinished(view, url);
      //在這里執行你想調用的js函數
  }
 
});

Uncaught TypeError: Object [object Object] has no method

安全限制問題

如果只在4.2版本以上的機器出問題,那么就是系統處于安全限制的問題了。Android文檔這樣說的

復制代碼 代碼如下:

Caution: If you've set your targetSdkVersion to 17 or higher, you must add the @JavascriptInterface annotation to any method that you want available your web page code (the method must also be public). If you do not provide the annotation, then the method will not accessible by your web page when running on Android 4.2 or higher.

中文大意為
復制代碼 代碼如下:

警告:如果你的程序目標平臺是17或者是更高,你必須要在暴露給網頁可調用的方法(這個方法必須是公開的)加上@JavascriptInterface注釋。如果你不這樣做的話,在4.2以以后的平臺上,網頁無法訪問到你的方法。

解決方法

1.將targetSdkVersion設置成17或更高,引入@JavascriptInterface注釋
2.自己創建一個注釋接口名字為@JavascriptInterface,然后將其引入。注意這個接口不能混淆。這種方式不推薦,大概在4.4之后有問題。

注,創建@JavascriptInterface代碼

復制代碼 代碼如下:

public @interface JavascriptInterface {

}

代碼混淆問題

如果在沒有混淆的版本運行正常,在混淆后的版本的代碼運行錯誤,并提示Uncaught TypeError: Object [object Object] has no method,那就是你沒有做混淆例外處理。 在混淆文件加入類似這樣的代碼

復制代碼 代碼如下:

-keep class com.example.javajsinteractiondemo$JsInteration {
    *;
}

All WebView methods must be called on the same thread

過濾日志曾發現過這個問題。

復制代碼 代碼如下:

E/StrictMode( 1546): java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {528712d4} called on Looper (JavaBridge, tid 121) {52b6678c}, FYI main Looper is Looper (main, tid 1) {528712d4})
E/StrictMode( 1546):   at android.webkit.WebView.checkThread(WebView.java:2063)
E/StrictMode( 1546):   at android.webkit.WebView.loadUrl(WebView.java:794)
E/StrictMode( 1546):   at com.xxx.xxxx.xxxx.xxxx.xxxxxxx$JavaScriptInterface.onCanGoBackResult(xxxx.java:96)
E/StrictMode( 1546):   at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
E/StrictMode( 1546):   at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
E/StrictMode( 1546):   at android.os.Handler.dispatchMessage(Handler.java:102)
E/StrictMode( 1546):   at android.os.Looper.loop(Looper.java:136)
E/StrictMode( 1546):   at android.os.HandlerThread.run(HandlerThread.java:61)

在js調用后的Java回調線程并不是主線程。如打印日志可驗證

復制代碼 代碼如下:

ThreadInfo=Thread[WebViewCoreThread,5,main]

解決上述的異常,將webview操作放在主線程中即可。

復制代碼 代碼如下:

webView.post(new Runnable() {
    @Override
    public void run() {
        webView.loadUrl(YOUR_URL).
    }
});

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩高清| 亚洲国产日韩欧美在线图片| 欧美一区二区色| 88xx成人精品| 亚洲天堂av在线播放| 97婷婷涩涩精品一区| 中文日韩电影网站| 上原亚衣av一区二区三区| 日韩视频在线观看免费| 国产精品美女在线| www.久久久久久.com| 亚洲电影免费观看高清完整版| 成人444kkkk在线观看| 日韩电视剧免费观看网站| 国产精品久久久久秋霞鲁丝| 国产日韩欧美另类| 欧美肥臀大乳一区二区免费视频| 亚洲国产婷婷香蕉久久久久久| 九色精品免费永久在线| 亚洲欧美中文字幕在线一区| 色噜噜国产精品视频一区二区| 日韩在线视频二区| 国产精品久久久久aaaa九色| 日韩精品在线看| 国产精品成人国产乱一区| 91高潮精品免费porn| 国产精品久久久久av| 亚洲白拍色综合图区| 亚洲第一网站男人都懂| 91精品成人久久| 综合av色偷偷网| 成人福利在线观看| 亚洲护士老师的毛茸茸最新章节| 成人有码在线视频| 欧洲s码亚洲m码精品一区| 黑人精品xxx一区一二区| 日韩av一区二区在线观看| 国产精品流白浆视频| 亚洲色图激情小说| 日韩精品日韩在线观看| 国产精品日韩在线一区| www.国产一区| 日本一区二区三区四区视频| 亚洲3p在线观看| 精品久久中文字幕久久av| 久久国内精品一国内精品| 久久久人成影片一区二区三区观看| 成人乱色短篇合集| 亚洲自拍偷拍福利| 狠狠躁夜夜躁人人躁婷婷91| 亚洲天堂一区二区三区| 91av视频在线免费观看| 国产欧美一区二区三区视频| 国产精品中文久久久久久久| 一区二区三区天堂av| 一区二区欧美久久| 中文字幕亚洲欧美日韩2019| 亚洲欧美成人精品| 精品一区二区亚洲| 欧美激情性做爰免费视频| 日本一区二三区好的精华液| 久久久久久国产精品| 日韩一二三在线视频播| 久热精品视频在线免费观看| 亚洲老头同性xxxxx| 日韩欧美中文在线| 午夜美女久久久久爽久久| 欧美性猛交xxxx乱大交极品| 欧美中文字幕视频| 久久久人成影片一区二区三区| 日韩在线视频免费观看高清中文| 国产91在线视频| 北条麻妃一区二区三区中文字幕| 国产91色在线| 97香蕉久久超级碰碰高清版| 日韩最新中文字幕电影免费看| 久久99精品久久久久久青青91| 亚洲福利在线视频| 国内精品久久久| 欧美电影在线免费观看网站| 亚洲va欧美va在线观看| 国产精品青青在线观看爽香蕉| 狠狠综合久久av一区二区小说| 久久福利视频网| 国产精品偷伦视频免费观看国产| 久久精品视频va| 国产精品永久免费视频| 一本色道久久综合狠狠躁篇的优点| 成人激情视频在线| 欧美精品国产精品日韩精品| 精品人伦一区二区三区蜜桃网站| 伊人久久久久久久久久久久久| 欧美精品videos性欧美| 成人黄色片网站| 久久精品视频网站| 亚洲2020天天堂在线观看| 亚洲国产欧美一区二区三区同亚洲| 亚洲自拍偷拍福利| 欧美乱大交xxxxx| 久久躁日日躁aaaaxxxx| 在线观看国产欧美| 亚洲国产一区二区三区四区| 亚洲天堂成人在线视频| 日韩美女写真福利在线观看| 久久91精品国产| 国产精品白丝av嫩草影院| 成人精品久久av网站| 日韩在线免费高清视频| 中文字幕视频一区二区在线有码| 亚洲精品成人av| 成人免费网站在线| 日韩在线观看视频免费| 久久精品国产99国产精品澳门| 热re91久久精品国99热蜜臀| 久久这里只有精品视频首页| 国产亚洲精品久久久优势| 亚洲97在线观看| 日韩欧美成人免费视频| 国产精品一二三视频| 亚洲人高潮女人毛茸茸| 影音先锋欧美在线资源| 亚洲精品久久久久中文字幕二区| 欧美—级a级欧美特级ar全黄| 成人亚洲综合色就1024| 久久亚洲影音av资源网| 欧美高清videos高潮hd| 国产精品欧美一区二区| 亚洲国产天堂久久国产91| 欧美精品久久一区二区| 久久精品亚洲国产| 尤物yw午夜国产精品视频| 日韩av日韩在线观看| 亚洲sss综合天堂久久| 国产亚洲成精品久久| 欧美精品久久久久久久久久| 最近的2019中文字幕免费一页| 国产女人精品视频| 九九热r在线视频精品| 91在线观看免费高清完整版在线观看| 欧美激情视频一区二区三区不卡| 色哟哟亚洲精品一区二区| 国产精品偷伦免费视频观看的| 久久伊人91精品综合网站| 亚洲欧美色婷婷| 欧美亚洲视频一区二区| 91系列在线播放| 亚洲aⅴ男人的天堂在线观看| 91热精品视频| 97精品一区二区视频在线观看| 久久精品99久久久香蕉| 日本一区二区三区在线播放| 亚洲男子天堂网| 国产一区二区久久精品| 97av在线视频免费播放| 欧美中文在线观看| 91av视频在线播放| 91国产精品视频在线| 一本一本久久a久久精品牛牛影视| 狠狠操狠狠色综合网| 亚洲欧美在线一区二区| 欧美一级片一区| 国产网站欧美日韩免费精品在线观看| 蜜臀久久99精品久久久无需会员| 欧美大码xxxx|