Android中webview與JS交互、互調(diào)方法實(shí)例詳解
Android中webview與JS交互、互調(diào)方法實(shí)例詳解
前言:
對(duì)于試水的功能,一般公司都會(huì)采用H5的方式來(lái)開(kāi)發(fā),可以用很少的資源與很短的項(xiàng)目工期來(lái)完成。
但許多情況下,H5頁(yè)面會(huì)需要一些原生持有的一些如用戶信息之類的數(shù)據(jù),一些交互也需要調(diào)用原生的,如toast之類要保持同一個(gè)手機(jī)風(fēng)格一致的交互行為。這個(gè)時(shí)候就需要能夠讓JS主動(dòng)調(diào)用原生的方法來(lái)進(jìn)行操作或者獲取數(shù)據(jù)?;蛘呤窃{(diào)用JS的方法在H5加載的時(shí)候傳遞一些參數(shù)。
對(duì)于原生調(diào)用JS的方法
我們需要實(shí)現(xiàn)一個(gè)WebViewClient,在這個(gè)WebViewClient里面進(jìn)行JS方法加載的替換
如
webView_.setWebViewClient(new WebViewClient() { public void onPageFinished(WebView view, String url) { view.loadUrl(MessageFormat.format("javascript:initEvaluationPage({0})", Util.wrapGetParameter(json) )); } });
這里的initEvaluationPage必須要和JS的方法名一致
建議傳遞json格式數(shù)據(jù)作為參數(shù)。
不要忘了允許WebView執(zhí)行JS代碼
webView_.getSettings()s.setJavaScriptEnabled(true);
對(duì)于JS調(diào)用原生方法,稍微復(fù)雜一些
首先,需要本地定義一個(gè)接口,接口名需要和JS內(nèi)寫(xiě)的一致
比如JS需要客戶端保存的用戶信息
JS中代碼是這樣的
var userInfo = JSON.parse(window.JSUserInfoInterface.getUserInfo());
那么我們本地也需要定義一個(gè)對(duì)應(yīng)的接口
public interface JSUserInfoInterface { @JavascriptInterface String getUserInfo(); }
接口名方法名一致
實(shí)例化這個(gè)接口,在實(shí)例方法內(nèi)返回我們的用戶信息
JSUserInfoInterface method3 = new JSUserInfoInterface() { @Override @JavascriptInterface public String getUserInfo() { SharedPreferences sharedPreferences = getActivity().getApplicationContext().getSharedPreferences( "share", Context.MODE_PRIVATE); String tel = sharedPreferences.getString(Constant.KEY_USERNAME, ""); String userid = sharedPreferences.getString("userid", ""); return "{\"user_id\":\"" + userid + "\",\"user_tel\":\"" + tel + "\"}"; } };
注意不能忘了 @JavascriptInterface注解
然后將這個(gè)接口方法加入到webView_中,注意第二個(gè)參數(shù)就是接口名,需要和JS中的一致。
webView_.addJavascriptInterface(method3, "JSUserInfoInterface");
這樣就可以在JS調(diào)用window.JSUserInfoInterface.getUserInfo()的時(shí)候返回我們實(shí)例里面給的數(shù)據(jù)
同樣的,我們也可以不返回?cái)?shù)據(jù)直接執(zhí)行。比如彈一個(gè)原生的Dialog。
需要注意的是JS里面是沒(méi)有主線程子線程的概念的,當(dāng)JS進(jìn)行網(wǎng)絡(luò)請(qǐng)求的時(shí)候,webview會(huì)默認(rèn)給他開(kāi)子線程。具體機(jī)制大家感興趣可以去了解。不過(guò)這也就意味著你不能直接在給JS掉的原生方法中進(jìn)行UI操作。你可以選擇發(fā)送給主線程執(zhí)行。
比如下面的代碼我是用rxjava來(lái)切換線程的
JSDialogInterface method2 = new JSDialogInterface() { @Override @JavascriptInterface public void changeDialog(String arg0) { Observable.just(arg0) .observeOn(AndroidSchedulers.mainThread()) .subscribe(mess -> { if (mess.equals("show")) { ld_.show(); } else { ld_.dismiss(); } }); } };
最后
一點(diǎn)小建議
如果你的項(xiàng)目中有很多或者一定數(shù)量的JS交互,建議寫(xiě)一個(gè)有返回值的接口。然后通過(guò)JSON參數(shù)來(lái)進(jìn)行控制。內(nèi)部制定一個(gè)解析協(xié)議,根據(jù)JSON的數(shù)據(jù)來(lái)決定要做什么事,避免大量定義接口 ,也避免構(gòu)建太多的實(shí)例消耗資源
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- Android的WebView與H5前端JS代碼交互的實(shí)例代碼
- Android webview與js的數(shù)據(jù)交互
- Android總結(jié)之WebView與Javascript交互(互相調(diào)用)
- Android WebView使用方法詳解 附j(luò)s交互調(diào)用方法
- Android中WebView與Js交互的實(shí)現(xiàn)方法
- Android WebView上實(shí)現(xiàn)JavaScript與Java交互
- android中WebView和javascript實(shí)現(xiàn)數(shù)據(jù)交互實(shí)例
- android中webview控件和javascript交互實(shí)例
- 解析Android中webview和js之間的交互
- Android WebView與JS交互全面詳解(小結(jié))
相關(guān)文章
Android Studio / IDEA kotlin 顯示 var 真實(shí)類型操作
這篇文章主要介紹了Android Studio / IDEA kotlin 顯示 var 真實(shí)類型操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08Android中Fragment與Activity的生命周期對(duì)比
這篇文章主要介紹了Android中Fragment與Activity的生命周期對(duì)比,Fragment是在Activity的基礎(chǔ)之上進(jìn)行設(shè)計(jì)的,比Activity多出幾個(gè)控制生命周期的回調(diào)函數(shù),需要的朋友可以參考下2016-02-02Android反編譯看看手Q口令紅包的實(shí)現(xiàn)原理
這篇文章主要介紹了Android反編譯看看手Q口令紅包的實(shí)現(xiàn)原理,需要的朋友可以參考下2016-02-02Android 實(shí)現(xiàn)無(wú)網(wǎng)絡(luò)傳輸文件的示例代碼
本篇文章主要介紹了Android 實(shí)現(xiàn)無(wú)網(wǎng)絡(luò)傳輸文件的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Android實(shí)現(xiàn)用文字生成圖片的示例代碼
本篇文章主要介紹了Android實(shí)現(xiàn)用文字生成圖片的示例代碼,這里整理了詳細(xì)的代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-08Android?Camera實(shí)現(xiàn)旋轉(zhuǎn)角度
這篇文章主要為大家詳細(xì)介紹了Android?Camera實(shí)現(xiàn)旋轉(zhuǎn)角度,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07Android編程使用AlarmManager設(shè)置鬧鐘的方法
這篇文章主要介紹了Android編程使用AlarmManager設(shè)置鬧鐘的方法,結(jié)合具體實(shí)例分析了Android基于AlarmManager實(shí)現(xiàn)鬧鐘功能的設(shè)置、取消、顯示等相關(guān)操作技巧,需要的朋友可以參考下2017-03-03Android之IphoneTreeView帶組指示器的ExpandableListView效果
在正在顯示的最上面的組的標(biāo)簽位置添加一個(gè)和組視圖完全一樣的視圖,作為組標(biāo)簽。這個(gè)標(biāo)簽的位置要隨著列表的滑動(dòng)不斷變化,以保持總是顯示在最上方,并且該消失的時(shí)候就消失2013-06-06