webView 与 Android交互详解
2017-07-31 22:05
405 查看
一: 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 JS如何与Android交互?3.1 通过WebView的addJavascriptInterface()实现步骤:步骤1:定义一个与JS对象映射关系的Android类:AndroidtoJsAndroidtoJs.java
// 继承自Object类public class AndroidtoJs extends Object {// 定义JS需要调用的方法// 被JS调用的方法必须加入@JavascriptInterface注解@JavascriptInterfacepublic void hello(String msg) {System.out.println("JS调用了Android的hello方法");}}1234567891012345678910步骤2:将需要调用的JS代码以
.html格式放到src/main/assets文件夹里需要加载JS代码:javascript.html
<!DOCTYPE html><html><head><meta charset="utf-8"><title>Carson</title><script>function callAndroid(){// 由于对象映射,所以调用test对象等于调用Android映射的对象test.hello("js调用了android中的hello方法");}</script></head><body>//点击按钮则调用callAndroid函数<button type="button" id="button1" onclick="callAndroid()"></button></body></html>1234567891011121314151617181912345678910111213141516171819步骤3:在Android里通过WebView设置Android类与JS代码的映射详细请看注释
public class MainActivity extends AppCompatActivity {WebView mWebView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mWebView = (WebView) findViewById(R.id.webview);WebSettings webSettings = mWebView.getSettings();// 设置与Js交互的权限webSettings.setJavaScriptEnabled(true);// 通过addJavascriptInterface()将Java对象映射到JS对象//参数1:Javascript对象名//参数2:Java对象名mWebView.addJavascriptInterface(new AndroidtoJs(), "test");//AndroidtoJS类对象映射到js的test对象// 加载JS代码// 格式规定为:file:///android_asset/文件名.htmlmWebView.loadUrl("file:///android_asset/javascript.html");3.2 通过WebViewClient 的shouldOverrideUrlLoading ()实现步骤:具体原理: Android通过
WebViewClient的回调方法
shouldOverrideUrlLoading()拦截 url解析该 url 的协议如果检测到是预先约定好的协议,就调用相应方法 即JS需要调用Android的方法具体使用: 步骤1:在JS约定所需要的Url协议 JS代码:javascript.html以.html格式放到src/main/assets文件夹里
<!DOCTYPE html><html><head><meta charset="utf-8"><title>Carson_Ho</title><script>function callAndroid(){/*约定的url协议为:js://webview?arg1=111&arg2=222*/document.location = "js://webview?arg1=111&arg2=222";}</script></head><!-- 点击按钮则调用callAndroid()方法 --><body><button type="button" id="button1" onclick="callAndroid()">点击调用Android代码</button></body></html>12345678910111213141516171819201234567891011121314151617181920当该JS通过Android的
mWebView.loadUrl("file:///android_asset/javascript.html")加载后,就会回调
shouldOverrideUrlLoading(),接下来继续看步骤2:步骤2:在Android通过WebViewClient复写
shouldOverrideUrlLoading ()MainActivity.java
public class MainActivity extends AppCompatActivity {WebView mWebView;// Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mWebView = (WebView) findViewById(R.id.webview);WebSettings webSettings = mWebView.getSettings();// 设置与Js交互的权限webSettings.setJavaScriptEnabled(true);// 设置允许JS弹窗webSettings.setJavaScriptCanOpenWindowsAutomatically(true);// 步骤1:加载JS代码// 格式规定为:file:///android_asset/文件名.htmlmWebView.loadUrl("file:///android_asset/javascript.html");// 复写WebViewClient类的shouldOverrideUrlLoading方法mWebView.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {// 步骤2:根据协议的参数,判断是否是所需要的url// 一般根据scheme(协议格式) & authority(协议名)判断(前两个参数)//假定传入进来的 url = "js://webview?arg1=111&arg2=222"(同时也是约定好的需要拦截的)Uri uri = Uri.parse(url);// 如果url的协议 = 预先约定的 js 协议// 就解析往下解析参数if ( uri.getScheme().equals("js")) {// 如果 authority = 预先约定协议里的 webview,即代表都符合约定的协议// 所以拦截url,下面JS开始调用Android需要的方法if (uri.getAuthority().equals("webview")) {// 步骤3:// 执行JS所需要调用的逻辑System.out.println("js调用了Android的方法");// 可以在协议上带有参数并传递到Android上HashMap<String, String> params = new HashMap<>();Set<String> collection = uri.getQueryParameterNames();}return true;}return super.shouldOverrideUrlLoading(view, url);}});}
三: 实际开发中的坑:
1:在Android中调用JS代码的时候,webView.Post方法必须在子线程中进行开启。2:预防addJavascriptInterface()漏洞4.2以下系统使用@addJavascriptInterface注解3:防止WebView内存泄漏使用getApplicationContext在Activity使用完毕之后记得销毁4:记得添加网络权限相关文章推荐
- Android:WebView与 JS 的三种交互方式详解与对比
- Android WebView与JavaScript交互详解
- Android中WebView与JS交互方式详解
- Android中webview与JS交互、互调方法实例详解
- Android开发中WebView与原生JS的数据交互详解
- WebView详解:Android和Js交互
- Android开发中WebView与原生JS的数据交互详解
- Android WebView与JS交互全面详解(小结)
- Android开发中WebView与原生JS的数据交互详解
- Android开发之WebView和JS交互详解
- Android WebView使用方法详解 附js交互调用方法
- Android中WebView与JS交互方式详解
- android 通过WebView与javascript实现数据交互
- Android中WebView详解
- Android中webView与javascript交互
- Android中webview跟JAVASCRIPT中的交互
- android webview and javascript 交互
- Android---Java与WebView的交互之Goolge翻译
- Android中WebView与Javascript的交互
- Android Application 和Webview 之间的交互