一: webView相关知识:
1 WebView是一个基于webkit引擎、展现web页面的控件。
2 常用类及方法:
WebSettings类,对WebView进行配置和管理
webView.onResume() ;
webView.onPause();
Webview.goBack()
Webview.goForward()
WebViewClient类,处理各种通知,请求事件
shouldOverrideUrlLoading() 所有加载都经过这个方法,划重点,很重要。
onPageStarted()
onPageFinished()
onLoadResource() 每一个资源(比如图片)的加载都会调用一次。
WebChromeClient类.辅助 WebView 处理 Javascript
onProgressChanged()用于显示加载进度
onReceivedTitle() 获取Web页中的标题
二: 如何与JS代码进行交互
1 Android和JS代码通过WebView控件进行交互。
2 Android如何与JS交互?
1.1 通过WebView的loadUrl()
调用流程如下:
将需要调用的JS代码以.html格式放到src/main/assets文件夹里
在JS代码中声明供Android调用的方法。
在Android里通过WebView设置调用JS代码
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.loadUrl("file:///android_asset/javascript.html");
//此处load的url即位放在本地的html文件
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
mWebView.post(new Runnable(){
public void run() {
//此处要注意,方法名必须与.html中相同。
mWebView.loadUrl("javascript:callJS()");
}
}
}
}
1.2 通过WebView的evaluateJavascript()
优点:该方法比第一种方法效率更高、使用更简洁。
代码如下:
mWebView.evaluateJavascript("javascript:callJS()",new ValueCallback<String>() {
public void onReceiveValue(String value) {
//处理js返回结果
}
}
3.1
通
过WebView的addJavascriptInterface()
实现步骤:
步骤1:定义一个与JS对象映射关系的Android类:AndroidtoJs
AndroidtoJs.java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
步骤2:将需要调用的JS代码以.html
格式放到src/main/assets文件夹里
需要加载JS代码:javascript.html
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
步骤3:在Android里通过WebView设置Android类与JS代码的映射
详细请看注释
3.2
通过
WebViewClient 的
shouldOverrideUrlLoading ()
实现步骤:
-
具体原理:
- Android通过
WebViewClient
的回调方法shouldOverrideUrlLoading ()
拦截 url - 解析该 url 的协议
- 如果检测到是预先约定好的协议,就调用相应方法
即JS需要调用Android的方法
- Android通过
-
具体使用:
步骤1:在JS约定所需要的Url协议
JS代码:javascript.html以.html格式放到src/main/assets文件夹里
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
当该JS通过Android的mWebView.loadUrl("file:///android_asset/javascript.html")
加载后,就会回调shouldOverrideUrlLoading ()
,接下来继续看步骤2:
步骤2:在Android通过WebViewClient复写shouldOverrideUrlLoading ()
MainActivity.java
三: 实际开发中的坑:
1:在Android中调用JS代码的时候,webView.Post方法必须在子线程中进行开启。
2:预防addJavascriptInterface()漏洞
4.2以下系统使用@addJavascriptInterface注解
3:防止WebView内存泄漏
使用getApplicationContext
在Activity使用完毕之后记得销毁
4:记得添加网络权限