android - 启动新 Activity 时调用两次 Android Activity 生命周期
问题描述
我基本上是在启动包含 WebView 的新 Activity。但是这个 WebView Activity 的生命周期在第一次运行时调用了两次。当销毁此活动并再次重新打开时,一切正常。
活动 A 运行
Act A -> onCreate
Act A -> onStart
Act A -> onResume
开始新的活动
startActivity(new Intent(this, WebViewActivity.class));
Activity B(WebView Activity)运行
Act A -> onPause
Act B -> onCreate
Act B -> onStart
Act B -> onResume
日志信息可能是导致这种情况的原因
W/WindowManager: Attempted to set replacing window on non-existing app token Token{1a4a5a ActivityRecord{219a05 u0 ui.activity.WebViewActivity t130}}
然后继续
Act B -> onPause
Act B -> onStop
Act B -> onDestroy
Act B -> onCreate
Act B -> onStart
Act B -> onResume
Act A -> onStop
我已经用许多设备测试过这种情况
Xiaomi mi a2 Lite Api 27-> error happens
Lg g4 Api 24 -> error happens
Huawei Nexus 6P Api 27-> error happens
Huawei Mate 10 Lite Api 26 -> error happens
Emulator Api 21 -> error not happens
Xiomi mi a2 Api 27 -> error not happens
是设备错误吗?还是操作系统错误?我该如何解决?如果有人可以提供帮助,我将不胜感激。
我的 WebView 活动代码
public class WebViewActivity extends BaseActivity implements ViewClickHandler {
public static final String TAG = WebViewActivity.class.getSimpleName();
public static final String URL = "https://www.google.com";
ActivityWebViewBinding binding;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_web_view);
binding.setClickHandler(this);
binding.setLifecycleOwner(this);
setToolbar(binding.toolbar, true, R.string.terms_of_service);
initWebview();
binding.webView.loadUrl(URL);
Log.d(TAG, "onCreate");
}
private void initWebview() {
binding.webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return super.shouldOverrideUrlLoading(view, request);
}
@Override
public void onPageStarted(
WebView view, String url, Bitmap favicon) {
try {
// showProgressDialog();
} catch (Exception ignore) {
}
}
@Override
public void onPageFinished(WebView view, String url) {
try {
// hideProgressDialog();
} catch (Exception ignore) {
}
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
//Your code to do
try {
// hideProgressDialog();
} catch (Exception ignore) {
}
}
});
binding.webView.setHorizontalScrollBarEnabled(false);
binding.webView.getSettings().setJavaScriptEnabled(true);
binding.webView.getSettings().setUseWideViewPort(true);
binding.webView.setInitialScale(1);
binding.webView.getSettings().setLoadWithOverviewMode(true);
}
@Override
public void onClick(View view) {
}
@Override
public void onCheckChange(View view, boolean isChecked) {
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
解决方案
我认为这个问题应该与上下文有关。您应该使用 Activity 的上下文。似乎您在 DataBindingUtil 类中使用错误的上下文实例化了 webview。请将 WebViewActivity 类的上下文传递给您的 Webview
推荐阅读
- linux - 不懂 Linux 命令“排序”
- scala - 我如何在 kantan 中创建自定义 CellEncoder
- youtube-data-api - 为什么我在 YouTube 数据 API v3 中收到 403 错误?
- parsing - BeautifulSoup - 所有href链接似乎都没有被提取
- javascript - 尝试使用反应路由器在反应中重定向
- c - ESC[2J 和 CLS 在编程上有何不同,我将如何使用 Windows API 在 C 中实现它?
- javascript - 如何使用 Mapbox 在单个页面中显示两个地图
- python-3.x - TensorFlow 中的多输入建模,带有生成器
- git - 在 GitHub 操作工作流中确定合并推送的源分支名称
- javascript - 在 JWPlayer 上禁用键盘快捷键