代码之家  ›  专栏  ›  技术社区  ›  binaryfunt Tom

如何在Android WebView的app resume中触发javascript事件

  •  0
  • binaryfunt Tom  · 技术社区  · 8 年前

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

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

    visibilitychange

    理想情况下,我希望使用Android触发某种javascript事件 onResume()

    1 回复  |  直到 7 年前
        1
  •  4
  •   binaryfunt Tom    8 年前

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

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

    window.appResumeEvent = new Event('appresume');
    
    window.addEventListener('appresume', yourFunction, false);
    
    function yourFunction() {…}
    

    在全局范围内设置create the app resume事件非常重要(这可以通过将其设置为 window ).

    现在,在你的安卓系统里 onResume() 方法,运行 evaluateJavascript() 方法:

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

    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) {
    
                }
            });
        }
    }