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

How to fire javascript event in Android WebView on app resume

我的 Android 应用程序中有一个 WebView,我需要 运行 一个 JavaScript 函数

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

在我的网页中使用 visibilitychange 事件侦听器 java脚本仅适用于案例 1。

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

您可以使用 WebView evaluateJavascript() 方法执行此操作。

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

window.appResumeEvent = new Event('appresume');

window.addEventListener('appresume', yourFunction, false);

function yourFunction() {…}

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

现在,在您的 Android onResume() 方法中,运行 evaluateJavascript() 方法:

@Override
protected void onResume() {
    super.onResume();
    mainWebView.evaluateJavascript("(function() { window.dispatchEvent(appResumeEvent); })();", new ValueCallback<String>() {
        @Override
        public void onReceiveValue(String value) {

        }
    });
}

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

更多信息:Creating and dispatching events in javascript (MDN)

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

import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {

    private WebView mainWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mainWebView = findViewById(R.id.activity_main_webview);
        mainWebView.setWebViewClient(new WebViewClient());
        WebSettings webSettings = mainWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        mainWebView.loadUrl("file:///android_asset/www/index.html");
    }

    @Override
    protected void onResume() {
        super.onResume();
        mainWebView.evaluateJavascript("(function() { window.dispatchEvent(appResumeEvent); })();", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {

            }
        });
    }
}