Android中webview與JS交互、互調方法實例詳解
Android中webview與JS交互、互調方法實例詳解
前言:
對于試水的功能,一般公司都會采用H5的方式來開發(fā),可以用很少的資源與很短的項目工期來完成。
但許多情況下,H5頁面會需要一些原生持有的一些如用戶信息之類的數據,一些交互也需要調用原生的,如toast之類要保持同一個手機風格一致的交互行為。這個時候就需要能夠讓JS主動調用原生的方法來進行操作或者獲取數據。或者是原生調用JS的方法在H5加載的時候傳遞一些參數。
對于原生調用JS的方法
我們需要實現一個WebViewClient,在這個WebViewClient里面進行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格式數據作為參數。
不要忘了允許WebView執(zhí)行JS代碼
webView_.getSettings()s.setJavaScriptEnabled(true);
對于JS調用原生方法,稍微復雜一些
首先,需要本地定義一個接口,接口名需要和JS內寫的一致
比如JS需要客戶端保存的用戶信息
JS中代碼是這樣的
var userInfo = JSON.parse(window.JSUserInfoInterface.getUserInfo());
那么我們本地也需要定義一個對應的接口
public interface JSUserInfoInterface {
@JavascriptInterface
String getUserInfo();
}
接口名方法名一致
實例化這個接口,在實例方法內返回我們的用戶信息
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注解
然后將這個接口方法加入到webView_中,注意第二個參數就是接口名,需要和JS中的一致。
webView_.addJavascriptInterface(method3, "JSUserInfoInterface");
這樣就可以在JS調用window.JSUserInfoInterface.getUserInfo()的時候返回我們實例里面給的數據
同樣的,我們也可以不返回數據直接執(zhí)行。比如彈一個原生的Dialog。
需要注意的是JS里面是沒有主線程子線程的概念的,當JS進行網絡請求的時候,webview會默認給他開子線程。具體機制大家感興趣可以去了解。不過這也就意味著你不能直接在給JS掉的原生方法中進行UI操作。你可以選擇發(fā)送給主線程執(zhí)行。
比如下面的代碼我是用rxjava來切換線程的
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();
}
});
}
};
最后
一點小建議
如果你的項目中有很多或者一定數量的JS交互,建議寫一個有返回值的接口。然后通過JSON參數來進行控制。內部制定一個解析協(xié)議,根據JSON的數據來決定要做什么事,避免大量定義接口 ,也避免構建太多的實例消耗資源
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- Android的WebView與H5前端JS代碼交互的實例代碼
- Android webview與js的數據交互
- Android總結之WebView與Javascript交互(互相調用)
- Android WebView使用方法詳解 附js交互調用方法
- Android中WebView與Js交互的實現方法
- Android WebView上實現JavaScript與Java交互
- android中WebView和javascript實現數據交互實例
- android中webview控件和javascript交互實例
- 解析Android中webview和js之間的交互
- Android WebView與JS交互全面詳解(小結)
相關文章
Android Studio / IDEA kotlin 顯示 var 真實類型操作
這篇文章主要介紹了Android Studio / IDEA kotlin 顯示 var 真實類型操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
Android中Fragment與Activity的生命周期對比
這篇文章主要介紹了Android中Fragment與Activity的生命周期對比,Fragment是在Activity的基礎之上進行設計的,比Activity多出幾個控制生命周期的回調函數,需要的朋友可以參考下2016-02-02
Android編程使用AlarmManager設置鬧鐘的方法
這篇文章主要介紹了Android編程使用AlarmManager設置鬧鐘的方法,結合具體實例分析了Android基于AlarmManager實現鬧鐘功能的設置、取消、顯示等相關操作技巧,需要的朋友可以參考下2017-03-03
Android之IphoneTreeView帶組指示器的ExpandableListView效果
在正在顯示的最上面的組的標簽位置添加一個和組視圖完全一樣的視圖,作為組標簽。這個標簽的位置要隨著列表的滑動不斷變化,以保持總是顯示在最上方,并且該消失的時候就消失2013-06-06

