Android 电源按钮和 Web 视图或可能的活动生命周期



我在 Web 视图和电源按钮的活动生命周期方面遇到问题。

我正在 webview 中加载带有游戏的 javascript 页面,并且我在应用程序上下文中保留 Web 视图,因此它在活动破坏中幸存下来。我知道我不应该像这样保存视图,但我有非常具体的情况,它是唯一的解决方案。在应用程序之间切换时它工作正常(即使使用"不保留活动"调试标志(,但是当我执行此方案时:

  1. 使用 Web 视图运行活动
  2. 游戏加载到 Web 视图后,按电源按钮关闭屏幕
  3. 重新打开屏幕
  4. 解锁屏幕(通过向上滑动(
  5. 活动将加载,但未加载 WebView,它只是黑屏

我尝试打印出所有活动生命周期方法,并且在两种情况下都是相同的。这两种情况有什么区别?

代码应用上下文:

public class MyApp extends Application {
    private WebView mWebView;
    //getter, setter ...
    //preserving webview in app context
}

代码活动:

public void onCreate() {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initWebView();
}
private void initWebView() {
    MyApp app = (MyApp) getApplication();
    mWebView = app.getWebView();
    if (!app.isWebViewInitialized()) {
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.getSettings().setDomStorageEnabled(true);
        mWebView.requestFocus();
        mWebView.addJavascriptInterface(new JavascriptInterface(this), "JSInterface");
        mWebView.loadUrl("http://js-game-url.com");
        mWebView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
        mWebView.setWebViewClient(new WebViewClient());
        app.setWebViewInitialized(true);
    } else {
        try {
            ((ViewGroup) mWebView.getParent()).removeView(mWebView);
            //todo remake the try catch
        } catch(NullPointerException e) {
            System.out.println("Null");    //todo remove try catch
        }
    }

    webviewPlaceholder = (RelativeLayout) findViewById(R.id.rlayout2);
    webviewPlaceholder.addView(mWebView);
}
protected void onPause() {
    super.onPause();
    webviewPlaceholder.removeView(mWebView);
}
protected void onResume() {
    super.onResume();
    initWebView();
}
protected void onDestroy() {
    super.onDestroy();
    webviewPlaceholder.removeView(mWebView);
}

我肯定错过了一些简单的东西,但我找不到解决方案。

这不是活动生命周期的问题,而是Webview JavaScript生命周期的问题。重新打开屏幕后重新创建活动时,Web 视图未获得焦点。这修复了它:

mWebView.requestFocus();

最新更新