Android与Js交互之JSBridge的使用

什么是JsBridge

JsBridge是js与Native之间进行通信的桥梁。

为什么要使用JsBridge

Android4.2以下的addJavascriptInterface存在安全漏洞,虽然在Android4.2之后用@JavascriptInterface代替了addJavascriptInterface但是由于兼容性和安全性问题,基本上我们不会再利用Android系统为我们提供的addJavascriptInterface方法或者@JavascriptInterface注解来实现,所以我们只能另辟蹊径,去寻找既安全,又能实现兼容Android各个版本的方案。

如何使用JsBridge

在Android中我们使用JsBridge开源项目来实现,实现JSBridge分为以下几个步骤。

步骤一:导入依赖

在项目gradle文件中添加
repositories {
        ...
        maven { url "https://jitpack.io" }
    }
在module的gradle中添加
dependencies {
    ...
    implementation 'com.github.lzyzsd:jsbridge:1.0.4'
}

步骤二:布局文件中用BridgeWebView代替WebView




    
    

步骤三:在Activity中对BridgeWebView进行配置

public class MainActivity extends AppCompatActivity {
    private EditText et;
    private Button bt;
    private BridgeWebView webview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et = (EditText) findViewById(R.id.et);
        bt = (Button) findViewById(R.id.bt);
        webview = (BridgeWebView) findViewById(R.id.webview);
        webview.setDefaultHandler(new DefaultHandler());
        webview.setWebChromeClient(new WebChromeClient());
        webview.loadUrl("file:///android_asset/test.html");
//      注册监听方法当js中调用callHandler方法时会调用此方法(handlerName必须和js中相同)
        webview.registerHandler("submitFromWeb", new BridgeHandler() {
            @Override
            public void handler(String data, CallBackFunction function) {
                Log.e("TAG", "js返回:" + data);
                //显示js传递给Android的消息
                Toast.makeText(MainActivity.this, "js返回:" + data, Toast.LENGTH_LONG).show();
                //Android返回给JS的消息
                function.onCallBack("我是js调用Android返回数据:" + et.getText().toString());
            }
        });
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//              调用js中的方法(必须和js中的handlerName想同)
                webview.callHandler("functionInJs", "Android调用js66", new CallBackFunction() {
                    @Override
                    public void onCallBack(String data) {
                        Log.e("TAG", "onCallBack:" + data);
                        Toast.makeText(MainActivity.this, data, Toast.LENGTH_LONG).show();
                    }
                });
            }
        });
    }
}

步骤四:编写html文件并对应Activity中的参数




    
    
    
    
    
    
    
    Test


button

步骤五:将html文件放入assets文件夹中

效果展示:

补充:

jsbridge调用默认的方法

●Activity代码

// 重写handler方法接收js的消息
 webview.setDefaultHandler(new DefaultHandler(){
            @Override
            public void handler(String data, CallBackFunction function) {
                Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
                function.onCallBack("Android收到了默认的消息");
            }
        });
        bt2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//              发送信息给js,此处不需要配置handlerName
                webview.send(et.getText().toString().trim(), new CallBackFunction() {
                    @Override
                    public void onCallBack(String data) {
//                      接收js的回调数据
                        Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

●html代码

 //初始化
           bridge.init(function(message, responseCallback) {
               var data = {
                   'Javascript Responds': 'Wee!'
               };
               //添加代码用来弹出Activity发送的默认消息
               alert(message);
               responseCallback(data);
           });
// 加入如下方法用于发送消息给Activity
function testClick2() {
var data2 = document.getElementById("text1").value;
          //参数一:调用java中的方法   submitFromWeb是方法名,必须和Android中注册时候的方法名称保持一致
          //参数二:返回给Android端的数据,可以为字符串,json等信息
          //参数三:js接收到Android传递过来的数据之后的相应处理逻辑

            window.WebViewJavascriptBridge.send(
        data2,
        function(responseData){
            //java中DefaultHandler所实现的方法中callback所定义的入参
            alert(responseData);
        }
    );
       }

案例源码

你可能感兴趣的:(Android与Js交互之JSBridge的使用)