android與js的互動之jsbridge使用

來源:互聯網
上載者:User

標籤:false   測試   監聽   ready   公眾號   公眾   lang   圖片   django   

眾所周知,app的一些功能可能會使用到H5開發,這就難免會遇到java與js 的相互調用,android 利用WebViewJavascriptBridge 實現js和java的互動,這裡介紹下JsBridge第三方庫的使用。
github傳送門:https://github.com/lzyzsd/JsBridge

簡單分析

java與js相互調用如下:
java發送資料給js,js接收並回傳給java
同理,js發送資料給java,java接收並回傳給js
同時兩套流程都存在「預設接收」 與 「指定接收」
大致調用流程圖如下:

依賴

項目build.gradle

repositories {    // ...    maven { url "https://jitpack.io" }}

app build.gradle

dependencies {    compile ‘com.github.lzyzsd:jsbridge:1.0.4‘}

xml裡直接使用com.github.lzyzsd.jsbridge.BridgeWebView替代原生WebView
另外放置兩個Button用於測試使用

<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_width="match_parent"    android:layout_height="match_parent">    <Button        android:id="@+id/java_to_js_default"        android:layout_width="180dp"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:text="java發送給js預設接收"        app:layout_constraintTop_toBottomOf="@+id/nav_bar" />    <Button        android:id="@+id/java_to_js_spec"        android:layout_width="180dp"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:text="java發送給js指定接收"        app:layout_constraintTop_toBottomOf="@+id/java_to_js_default" />    <com.github.lzyzsd.jsbridge.BridgeWebView        android:id="@+id/webView"        android:layout_width="0dp"        android:layout_height="0dp"        app:layout_constraintBottom_toBottomOf="parent"        app:layout_constraintLeft_toLeftOf="parent"        app:layout_constraintRight_toRightOf="parent"        app:layout_constraintTop_toBottomOf="@+id/java_to_js_spec" /></android.support.constraint.ConstraintLayout>

html檔案裡簡單放置兩按鈕發送資料,同時提供列印資訊

<html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><div>    <button onClick="jsToJavaDefault()">js發送給java預設接收</button></div><br/><div>    <button onClick="jsToJavaSpec()">js發送給java指定接收</button></div><br/><div id="show">列印資訊</div></body></html>

這裡我本地跑的一個簡單的django項目,起了個服務供使用

webView.loadUrl("http://10.0.0.142:8000/cake/jsbridge");

webview載入頁面

java發送資料給js

button註冊監聽

javaToJsDefault.setOnClickListener(this);javaToJsSpec.setOnClickListener(this);

按鈕點擊事件,java傳遞資料給js

    //java傳遞資料給js    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.java_to_js_default:                //預設接收                webView.send("發送資料給js預設接收", new CallBackFunction() {                    @Override                    public void onCallBack(String data) { //處理js回傳的資料                        Toast.makeText(WebTestActivity.this, data, Toast.LENGTH_LONG).show();                    }                });                break;            case R.id.java_to_js_spec:                //指定接收參數 functionInJs                webView.callHandler("functionInJs", "發送資料給js指定接收", new CallBackFunction() {                    @Override                    public void onCallBack(String data) { //處理js回傳的資料                        Toast.makeText(WebTestActivity.this, data, Toast.LENGTH_LONG).show();                    }                });                break;            default:                break;        }    }

js WebViewJavascriptBridge註冊事件監聽,接收資料

<script>       //註冊事件監聽,初始化       function setupWebViewJavascriptBridge(callback) {           if (window.WebViewJavascriptBridge) {               callback(WebViewJavascriptBridge)           } else {               document.addEventListener(                   ‘WebViewJavascriptBridgeReady‘                   , function() {                       callback(WebViewJavascriptBridge)                   },                   false               );           }       }       //回呼函數,接收java發送來的資料       setupWebViewJavascriptBridge(function(bridge) {           //預設接收           bridge.init(function(message, responseCallback) {               document.getElementById("show").innerHTML = ‘預設接收到Java的資料: ‘ + message;               var responseData = ‘js預設接收完畢,並回傳資料給java‘;               responseCallback(responseData); //回傳資料給java           });           //指定接收,參數functionInJs 與java保持一致           bridge.registerHandler("functionInJs", function(data, responseCallback) {               document.getElementById("show").innerHTML = ‘指定接收到Java的資料: ‘ + data;               var responseData = ‘js指定接收完畢,並回傳資料給java‘;               responseCallback(responseData); //回傳資料給java           });       })       <script>

java發送給js預設接收

java發送給js指定接收

js發送資料給java

js按鈕點擊事件, 同時需要上面WebViewJavascriptBridge的註冊監聽回呼函數

    //js傳遞資料給java    function jsToJavaDefault() {       var data = ‘發送資料給java預設接收‘;       window.WebViewJavascriptBridge.send(           data           , function(responseData) { //處理java回傳的資料              document.getElementById("show").innerHTML = responseData;           }       );   }   function jsToJavaSpec() {       var data=‘發送資料給java指定接收‘;       window.WebViewJavascriptBridge.callHandler(           ‘submitFromWeb‘ //指定接收參數 submitFromWeb與java一致           ,data           , function(responseData) { //處理java回傳的資料              document.getElementById("show").innerHTML = responseData;           }       );   }

java 監聽接收資料

        //預設接收        webView.setDefaultHandler(new BridgeHandler() {            @Override            public void handler(String data, CallBackFunction function) {                String msg = "預設接收到js的資料:" + data;                Toast.makeText(WebTestActivity.this, msg, Toast.LENGTH_LONG).show();                function.onCallBack("java預設接收完畢,並回傳資料給js"); //回傳資料給js            }        });        //指定接收 submitFromWeb 與js保持一致        webView.registerHandler("submitFromWeb", new BridgeHandler() {            @Override            public void handler(String data, CallBackFunction function) {                String msg = "指定接收到js的資料:" + data;                Toast.makeText(WebTestActivity.this, msg, Toast.LENGTH_LONG).show();                function.onCallBack("java指定接收完畢,並回傳資料給js"); //回傳資料給js            }        });

js發送給java預設接收

js發送給java指定接收

至此,jsBridge的使用流程完畢。
歡迎關注我的部落格:https://blog.manjiexiang.cn/
歡迎關注公眾號

android與js的互動之jsbridge使用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.