Android 原生程式(Java)和 WebView 網頁中的 JavaScript 互相呼叫溝通。
- 原生程式(Java)呼叫執行網頁JavaScipt
例如,想在 APP onResume 時,執行網頁 JS 的 testJava2JS()函式。
方法1: 使用 WebView.loadUrl() 執行網頁的JS
[網頁的JS]<script> function testJava2JS(aa) { alert(aa); } </script>
[Java程式碼]@Override protected void onResume() { super.onResume(); WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.loadUrl("javascript:testJava2JS('Java呼叫JS測試1')"); }
方法2:使用 WebView.evaluateJavascript() 執行網頁的JS,此方式有個onReceiveValue()方法可處理JS返回的值
[網頁的JS]<script> function testJava2JS(aa) { alert(aa); return "testJava2JS 接收到:" + aa; } </script>
[Java程式碼]@Override protected void onResume() { super.onResume(); WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.evaluateJavascript("testJava2JS('Java呼叫JS測試2')", new ValueCallback<String>() { @Override public void onReceiveValue(String v) { Log.i("觀察 js return", v); } }); }
- 網頁JavaScipt呼叫執行原生程式(Java)
例如,Java中有個 class JS2Java,裡面有兩個要給JavaScipt呼叫的方法 testToast1()、testToast2()
[Java程式碼]public class MainActivity extends AppCompatActivity { WebView webview; WebSettings webSettings; //新增一個類別,裡面有給testToast1()、testToast2()兩個方法給JavaScript呼叫用 public class JS2Java { Context mContext; JS2Java(Context c) { mContext = c; } @JavascriptInterface public void testToast1(String msg) { Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show(); } @JavascriptInterface public void testToast2() { Toast.makeText(mContext, "測試testToast2", Toast.LENGTH_SHORT).show(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webview = (WebView) findViewById(R.id.webview); webSettings = webview.getSettings(); ..... webSettings.setJavaScriptEnabled(true);//開啟JS ...... //新增給JavaScript呼叫用的類別實例,並綁定一個名稱(例如:appJava)(在JavaScript呼叫時使用的名稱) webview.addJavascriptInterface(new JS2Java(this), "appJava"); ...... webview.loadUrl("file:///android_asset/index.html"); } }
[網頁的JS]<script> appJava.testToast1('測試testToast1...'); appJava.testToast2(); </script>
參考:
- https://stackoverflow.com/questions/52452246/how-to-fire-javascript-event-in-android-webview-on-app-resume
How to fire javascript event in Android WebView on app resume - Stack Overflow - https://imnerd.org/android-webview-and-js.html
前端 WebView 指南之 Android 交互篇 | 怡红院落 - https://blog.csdn.net/carson_ho/article/details/64904691
Carson带你学Android:你要的WebView与 JS 交互方式都在这里了_Carson带你学Android的博客-CSDN博客_android 调用js方法 - https://juejin.cn/post/6844903564737789965
Android:是时候掌握WebView与Js的交互技术了 - 掘金 - https://developer.android.com/reference/android/webkit/WebView#loadUrl(java.lang.String)
WebView | Android Developers - loadUrl - https://developer.android.com/reference/android/webkit/WebView#evaluateJavascript(java.lang.String,%20android.webkit.ValueCallback%3Cjava.lang.String%3E)
WebView | Android Developers - evaluateJavascript - https://segmentfault.com/a/1190000004895840
Android-Java和JavaScript相互调用 - SegmentFault 思否 - https://developer.android.com/guide/webapps/webview.html
Building web apps in WebView | Web Apps | Android Developers
沒有留言:
張貼留言