Android与JS相互调用详解
一、通过WebView的addJavascriptInterface()进行对象映射
1、原理:Android和JS通过webview.addJavascriptInterface(new JSKit(),"mjs")
方法形成对象映射,JS中的mjs
对象就可以调用Android中的JSKit
对象中的方法。
2、具体使用步骤
在Android里设置映射:在Activity中,先获取WebView组件,启用JavaScript,然后通过addJavascriptInterface()
方法将Java对象映射到JS对象,创建一个JSKit
类,并在其中定义需要被JS调用的方法,同时加上@JavascriptInterface
注解。
在JS中调用Android方法:在HTML文件中,通过JavaScript代码直接调用映射后的JS对象(即mjs
)的方法,调用mjs.hello("js去调用了android中的hello方法");
。
3、优缺点
优点:使用简单,仅需将Android对象和JS对象映射即可实现相互调用。
缺点:对于Android 4.2以下版本存在安全漏洞,需要采用拦截prompt()的方式进行漏洞修复;对于Android 4.2及以上版本,则需对被JS调用的函数添加@JavascriptInterface
注解。
二、通过WebViewClient的shouldOverrideUrlLoading()方法回调拦截url
1、原理:Android通过WebViewClient的回调方法shouldOverrideUrlLoading()
拦截URL,解析该URL的协议,如果检测到是预先约定好的协议,就调用相应方法。
2、具体使用步骤
在JS中约定URL协议:在JS代码中,通过改变window.location或document.location来约定一个特殊的URL协议,如js://webview?arg1=111&arg2=222
。
在Android中复写shouldOverrideUrlLoading()方法:在Activity中,复写WebViewClient的shouldOverrideUrlLoading()
方法,当检测到预定的URL协议时,执行相应的操作。
3、优缺点
优点:无需对JS进行修改,只需在Android端进行配置即可实现调用。
缺点:需要在Android和JS之间约定好URL协议,且每次调用都需要进行URL拦截和解析,效率相对较低。
相关问题与解答
1、问:如何在Android中保持与JS对象的映射关系,避免因页面刷新或重新加载而丢失?
答:可以在Android的Activity或Fragment的生命周期方法中重新添加JS对象映射,确保在页面刷新或重新加载后仍能保持映射关系,在onResume()
或onStart()
方法中重新调用addJavascriptInterface()
方法。
2、问:在使用shouldOverrideUrlLoading()
方法拦截URL时,如何传递复杂的数据类型或多个参数?
答:可以通过将复杂数据类型转换为JSON格式字符串,并通过URL的查询参数进行传递,在Android端接收到URL后,再将JSON字符串解析回对应的数据类型或多个参数。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1623602.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复