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

时间:2016-02-15 18:29:01

标签: android android-activity webview android-lifecycle

我在使用webview和电源按钮时遇到活动生命周期问题。

我正在使用webview中的游戏加载javascript页面,我在Application上下文中保留了webview,因此它可以在Activity破坏中幸存下来。我知道我应该保存这样的视图,但我有一个非常具体的场景,它是唯一的解决方案。在应用程序之间切换时工作正常(即使使用"不要保留活动"调试标志)但是当我这样做时:

  1. 使用webview运行活动
  2. 一旦游戏加载到webview按电源按钮关闭屏幕
  3. 重新开启屏幕
  4. 解锁屏幕(通过向上滑动)
  5. 活动将加载,但未加载webview,它只是黑屏
  6. 我尝试打印出所有活动生命周期方法,并在两种情况下都相同。这两种情景有什么区别?

    代码应用上下文:

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

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

1 个答案:

答案 0 :(得分:0)

活动生命周期不是问题,但是机智的webview javascript生命周期。在重新打开屏幕后重新创建活动时,webview没有获得焦点。这修好了它:

mWebView.requestFocus();