Android與WebView資料互動
1. 建立Android 專案
-
- 開啟Android Studio
-
- 建立一個空的Android專案
-
- 開啟Android虛擬機器,這裡使用的是Genymotion
2. 新增webview
-
- 清空layout內容,新增WebView控制元件
<WebView
android:id="@+id/web"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
-
- 在
MainActivity
中建立引入webview
- 在
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView mweb = findViewById(R.id.web);
mweb.loadUrl("http://www.baidu.com");
}
-
- 此時執行專案,發現android安裝成功,webview也可以開啟,但是頁面請求失敗,需要給APP新增聯網許可權。
在AndroidManifest.xml
的manifest
標籤內新增
- 此時執行專案,發現android安裝成功,webview也可以開啟,但是頁面請求失敗,需要給APP新增聯網許可權。
<uses-permission android:name="android.permission.INTERNET"/>
-
- 此時執行專案,發現webview可以開啟並且百度頁面可以訪問了,但是仔細發現webview並不是在自己的APP上開啟的,而是彈出系統瀏覽器。因為webview只是載體,內容的渲染需要使用webviewChromClient類去實現此時需要
setWebViewClient
- 此時執行專案,發現webview可以開啟並且百度頁面可以訪問了,但是仔細發現webview並不是在自己的APP上開啟的,而是彈出系統瀏覽器。因為webview只是載體,內容的渲染需要使用webviewChromClient類去實現此時需要
...
WebView mweb = findViewById(R.id.web);
mweb.setWebViewClient(new WebViewClient());
mweb.loadUrl("http://www.baidu.com");
...
-
- 執行APP後可以看到webview已經差不多是我們想要的了
3. 設定JavaScript可執行
仔細看會發現,通過上面步驟開啟的百度首頁跟我們平時看到的廣告頁面不一樣,原因是WebView預設禁止了JS的執行。這也是我覺得百度首頁做的比較好的地方,在無JS環境下仍可提供服務。
- 新增
setJavaScriptEnabled
...
mweb.setWebViewClient(new WebViewClient());
mweb.getSettings().setJavaScriptEnabled(true);
mweb.loadUrl("http://www.baidu.com");
...
此時再開啟頁面,就會發現廣告出來了,並且頁面很卡。
4. WebView 呼叫 Android 方法
1. 使用addJavascriptInterface
-
- 新增JS介面
建立JavaScriptInterFace.java
類,用來寫JS呼叫方法
- 新增JS介面
package com.test.myapplication;
import android.util.Log;
import android.webkit.JavascriptInterface;
public class JavaScriptInterFace {
@JavascriptInterface
public String getValue(String name) {
Log.d("tagee", "getValue:" + name);
return "call back";
}
}
因為安全問題,在Android4.2中JS只能訪問帶有 @JavascriptInterface
註解的Java函式。
-
- addJavascriptInterface注入
...
mweb.setWebViewClient(new WebViewClient());
mweb.getSettings().setJavaScriptEnabled(true);
mweb.addJavascriptInterface(new JavaScriptInterFace(), "JSBridge");
// JSBridge 為 webview 中呼叫的物件名稱
mweb.loadUrl("http://www.baidu.com");
...
-
- 載入本地 html 檔案
在app/src/main
目錄下面建立目錄assets
並新建a.html
檔案,寫入如下程式碼
<!doctype html>
<html lang="en">
<head></head>
<body>
<h1 id="h1">123</h1>
<script>
if(window.JSBridge){
alert(JSBridge.getValue(`from JS`));
}
</script>
</body>
</html>
修改webview的loadUrl
引數
mweb.addJavascriptInterface(new JavaScriptInterFace(), "JSBridge");
mweb.loadUrl("file:///android_asset/a.html");
此時重新build,可以看到Logcat
列印出from JS
,並且頁面彈窗。
2.通過loadUrl()
loadUrl
可以執行JavaScript程式碼,他有如下特徵:
1. 呼叫`loadUrl`會重新整理頁面
2. 當引數為要執行的JS程式碼時,要有document物件,至少得load一個空白頁,否則會失效
3. 若返回值為非空字串,則會將返回值替換頁面原本的內容
4. 可以呼叫html中的js程式碼,但需要在`onPageFinished`回撥之後才能呼叫,並且注意第三點的影響,防止返回字串替換文件
如:
...
mweb.addJavascriptInterface(new JavaScriptInterFace(), "JSBridge");
mweb.loadUrl("javascript:aler(123)"); //因當前webview沒用載入任何頁面,指令碼無效
...
mweb.addJavascriptInterface(new JavaScriptInterFace(), "JSBridge");
mweb.loadUrl("file:///android_asset/a.html");
mweb.loadUrl("javascript:`123`"); //此時頁面被替換成123
protected void onCreate(Bundle savedInstanceState) {
...
mweb.addJavascriptInterface(new JavaScriptInterFace(), "JSBridge");
mweb.setWebViewClient(new mWebViewClient());
mweb.loadUrl("file:///android_asset/a.html");
}
...
private class mWebViewClient extends WebViewClient{
@Override
public void onPageFinished(WebView view, String url) {
view.loadUrl("javascript:callJS()");//callJS為a.html中定義的方法
super.onPageFinished(view, url);
}
}
實際使用時,Android更多的是呼叫遠端JS程式碼,即將載入的JS程式碼路徑改成url即可。或則直接拼接JS程式碼時也會放在閉包中執行,防止替換頁面內容。
3. 通過evaluateJavascript()
如果是Android4.4後,推薦使用evaluateJavascript
,比loadUrl
效率更高,並且不會重新整理頁面。evaluateJavascript
有兩個引數,第一個為指令碼內容,第二個則是指令碼的執行結果。在onPageFinished
呼叫:
view.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.d("tagee", value);
}
});
4. 通過shouldOverrideUrlLoading()
shouldOverrideUrlLoading
是WebViewClient
物件的一個”生命週期”,用攔截URL的請求,監聽網頁地址的變化,返回ture
或false
來決定webview是否載入URL。
1. 若沒有設定 WebViewClient 則由系統(Activity Manager)處理該 url,通常是使用瀏覽器開啟或彈出瀏覽器選擇對話方塊,即出現上文2.4的情況。
2. 若設定 WebViewClient 且該方法返回 true ,則說明由應用的程式碼處理該 url,WebView不跳轉。
3. 若設定 WebViewClient 且該方法返回 false,則說明由 WebView 處理該 url,即用 WebView 載入該 url。
private class mWebViewClient extends WebViewClient{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//此處可以解析url進行處理,
//也可以直接呼叫view.loadUrl(url); 在當前的webview中跳轉到新的url
//若前端直接location.href="js://web?param1=123¶m2=asd"
Uri uri = Uri.parse(url);
if ( uri.getScheme().equals("js")) {
//可以在此處獲取頁面請求資料並處理
//或則直接跳轉activity等
return true;
}
return false;
}
}
值得一提的是以前一直有一個誤區,以為使用一個不可見的iframe
標籤,再動態改變其src
也可以捕捉url變化達到傳值的目的。測試過不可行,包括預設寫入和動態建立iframe
4. 通過onJsAlert()、onJsConfirm()、onJsPrompt()
原理和上面一條一樣,通過監聽頁面的彈窗事件,達到傳值的目的,不細說了。
相關文章
- Android webview 與 js(Vue) 互動AndroidWebViewJSVue
- Android webview JS 互動AndroidWebViewJS
- Flutter使用JsBridge與WebView互動FlutterJSWebView
- Android FlatBuffers資料互動Android
- Android ReactNative資料互動AndroidReact
- Android 與 JavaScript 互動 支援的資料型別AndroidJavaScript資料型別
- Flutter WebView與JS互動簡易指南FlutterWebViewJS
- WebView與APP互動實戰記錄WebViewAPP
- WKWebView和WebView與JS的互動方式WebViewJS
- WebView與JS的互動,以及注意事項WebViewJS
- WebView詳解與簡單實現Android與H5互調WebViewAndroidH5
- Flutter 與 Android 的互動FlutterAndroid
- Android WebView:這是一份 詳細 & 易懂的WebView學習攻略(含與JS互動、快取構建等)AndroidWebViewJS快取
- Hive 與 ElasticSearch 的資料互動HiveElasticsearch
- python與mysql資料庫互動PythonMySql資料庫
- Flutter 與 Android 原生 WebView 對比FlutterAndroidWebView
- React Native與Android通訊互動React NativeAndroid
- PHP與Python進行資料互動PHPPython
- SqlSugar與資料庫互動官網SqlSugar資料庫
- flutter webView 使用以及與 js 互操作FlutterWebViewJS
- iOS高階-WebView & JavaScript互動(附DEMO)iOSWebViewJavaScript
- 資料互動
- JockeyJS——優秀的WebView與JS互動開源庫使用和解析JSWebView
- Android與Flutter混合開發-UI互動AndroidFlutterUI
- RN與原生互動(二)——資料傳遞
- react native ScrollView巢狀WebView 互動問題React Native巢狀WebView
- Flask資料互動Flask
- weex與android互動初步接入,遇到的坑Android
- flask筆記:flask與資料庫的互動Flask筆記資料庫
- Redis資料庫4:Go與Redis的互動Redis資料庫Go
- MySQL資料庫5:Go與MySQL的互動MySql資料庫Go
- python與使用者互動、資料型別Python資料型別
- python資料庫-MySQL與python的互動(52)Python資料庫MySql
- [Android]高效能MMKV資料互動分析-MMKV初始化Android
- 資料互動筆記筆記
- Android WebView Resources$NotFoundExceptionAndroidWebViewException
- Android WebView的坑AndroidWebView
- android webview總結AndroidWebView