如何在应用程序恢复时触发 Android WebView 中的 javascript 事件

bin*_*unt 8 javascript events android onresume android-webview

我的 Android 应用程序中有一个 WebView,并且我需要在任何时候运行 JavaScript 函数

  1. 应用程序/WebView 切换到(例如使用应用程序切换器或点击主屏幕上的图标)
  2. 设备从睡眠状态唤醒(当设备进入睡眠状态时,应用程序仍然在屏幕上)。

在我的网页 javascript 中使用visibilitychange事件侦听器仅适用于情况 1。

理想情况下,我想使用 Android java 函数触发某种 javascript 事件onResume(),但是如何触发呢?

bin*_*unt 7

您可以使用 WebViewevaluateJavascript()方法来执行此操作。

\n\n

首先,您需要在网页 JavaScript 中创建一个事件,并添加事件处理程序:

\n\n
window.appResumeEvent = new Event(\'appresume\');\n\nwindow.addEventListener(\'appresume\', yourFunction, false);\n\nfunction yourFunction() {\xe2\x80\xa6}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在全局范围内设置创建应用程序恢复事件非常重要(可以通过将其设置为 的属性来实现window)。

\n\n

现在,在您的 AndroidonResume()方法中,运行该evaluateJavascript()方法:

\n\n
@Override\nprotected void onResume() {\n    super.onResume();\n    mainWebView.evaluateJavascript("(function() { window.dispatchEvent(appResumeEvent); })();", new ValueCallback<String>() {\n        @Override\n        public void onReceiveValue(String value) {\n\n        }\n    });\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,JavaScript 必须包装在立即调用的函数表达式中。另请注意,dispatchEvent()将事件变量作为参数,而不是事件名称字符串。

\n\n

详细信息:在 javascript 中创建和分派事件(MDN)

\n\n

对于我的完整MainActivity.java点击显示片段:

\n\n

\r\n
\r\n
import android.webkit.WebSettings;\r\nimport android.webkit.WebView;\r\nimport android.webkit.WebViewClient;\r\n\r\npublic class MainActivity extends AppCompatActivity {\r\n\r\n    private WebView mainWebView;\r\n\r\n    @Override\r\n    protected void onCreate(Bundle savedInstanceState) {\r\n        super.onCreate(savedInstanceState);\r\n        setContentView(R.layout.activity_main);\r\n\r\n        mainWebView = findViewById(R.id.activity_main_webview);\r\n        mainWebView.setWebViewClient(new WebViewClient());\r\n        WebSettings webSettings = mainWebView.getSettings();\r\n        webSettings.setJavaScriptEnabled(true);\r\n\r\n        mainWebView.loadUrl("file:///android_asset/www/index.html");\r\n    }\r\n\r\n    @Override\r\n    protected void onResume() {\r\n        super.onResume();\r\n        mainWebView.evaluateJavascript("(function() { window.dispatchEvent(appResumeEvent); })();", new ValueCallback<String>() {\r\n            @Override\r\n            public void onReceiveValue(String value) {\r\n\r\n            }\r\n        });\r\n    }\r\n}
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n