JsBridge:安卓和javascript最流行的交互方式,有以下4种方式可以实现交互传值
- 1,addJavascriptInterface:针对Android 4.2(API 17)及以上,只有标有@JavascriptInterface注解的public方法才能从js调用。而对targetSdkVersion为API Level 16及以下的app,js可以调用Java所有的public方法。
- 通过public void addJavascriptInterface (Object object, String name)方法把对象传递给js,
- 2, loadUrl:可以实现安卓调用js,通过webview.loadUrl("javascript:jsMethod()");字符串里的javascript: 是固定写法,后面的jsMethod可以替换成你js代码里的方法。也可以通过"javascript:jsMethod(" + jsonParams + ")";传递数据给js。这个缺点:如果js方法返回数据,这里会发生重定向。解决办法是用evaluateJavascript
- 3,evaluateJavascript:安卓4.4以后可以实现安卓调用js,安卓可以传数据给js,并且可以获取js方法的返回值。
- 缺点:必须大于api19(4.4)才可以使用
- 4,shouldOverrideUrlLoading:通过这个方法拦截url,并解析url携带的参数,如:qiushi://setH5Info?params={"title"%3A"商品详情"}
js调用安卓
- webView.addJavascriptInterface()
- WebViewClient.shouldOverrideUrlLoading()
安卓调用js
- webView.loadUrl();
- webView.evaluateJavascript()
下面我门结合代码具体讲解下这4中方式的具体代码实现
- 首先我们要在androidstudio的assets文件夹下面定义下面html。
Untitled Document
一,addJavascriptInterface 实现js调用安卓
- 针对Android 4.2(API 17)及以上
- js可以调用安卓方法
- 通过调用安卓方法可以实现安卓向js传递数据
- 要被js调用的方法必须加@JavascriptInterface注释
- 使用这个方法前必须设置webview.getSettings().setJavaScriptEnabled(true);
主要通过
public void addJavascriptInterface(Object object, String name) {}方法实现js调用安卓原生代码,简单讲解下两个参数。
object:安卓对象
name:安卓对象的别名。
如我们定义
webview.addJavascriptInterface(JavaH5Activity.this, "androidObject");就是把JavaH5Activity的实例命名为androidObject传递给js。
我们在js里的调用如下
完整代码如下:
public class JavaH5Activity extends AppCompatActivity { private WebView webview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_java_h5); webview = findViewById(R.id.webview); String url = "file:///android_asset/h5demo2.html"; webview.loadUrl(url); //1,js调用安卓 webview.getSettings().setJavaScriptEnabled(true);//这里必须开启 //把当前JavaH5Activity对象作为androidObject别名传递给js //js通过window.androidObject.androidMethod()就可以直接调用安卓的androidMethod方法 webview.addJavascriptInterface(JavaH5Activity.this, "androidObject"); } //js调用安卓,必须加@JavascriptInterface注释的方法才可以被js调用 @JavascriptInterface public String androidMethod() { Log.i("qcl0228