我在 Web 视图和电源按钮的活动生命周期方面遇到问题。
我正在 webview 中加载带有游戏的 javascript 页面,并且我在应用程序上下文中保留 Web 视图,因此它在活动破坏中幸存下来。我知道我不应该像这样保存视图,但我有非常具体的情况,它是唯一的解决方案。在应用程序之间切换时它工作正常(即使使用"不保留活动"调试标志(,但是当我执行此方案时:
- 使用 Web 视图运行活动
- 游戏加载到 Web 视图后,按电源按钮关闭屏幕
- 重新打开屏幕
- 解锁屏幕(通过向上滑动(
- 活动将加载,但未加载 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();