如何解决重新启动活动时调用onStop延迟
在《Android开发人员指南的活动生命周期》中。
当一项活动开始另一项活动时,它们都会经历生命周期过渡。第一个活动停止运行,并进入“已暂停”或“已停止”状态,而另一个活动被创建。如果这些活动共享保存到磁盘或其他位置的数据,则必须了解在创建第二个活动之前,第一个活动并未完全停止。相反,启动第二个进程的过程与停止第一个进程的过程重叠。
生命周期回调的顺序定义明确,尤其是当两个活动处于同一进程(应用程序)中并且一个活动正在启动另一个活动时。这是活动A启动活动B时发生的操作顺序:
因此,您描述的行为是预期的或可预测的。
回到您的问题。
1.重启活动时如何彻底销毁PrevIoUsActivity?
- 使用重新创建 API
2.使用recreate()时是否有方法放置putExtras?
- 从重新创建文档
public void recreate ()
使该活动用新实例重新创建。由于配置更改,这导致与创建Activity时基本上相同的流程- 当前实例将通过其生命周期进入onDestroy(),然后在其之后创建一个新实例。
因为将重新创建活动,所以也会调用onSaveInstanceState和onRestoreInstanceState。正如您可以猜到的想法是保存在数据onSaveInstanceState
和检索onRestoreInstanceState
或onCreate
。
步骤1:将资料储存在 onSaveInstanceState
// The key for saving and retrieving isActivityRecreated field.
private static final String KEY_IS_ACTIVITY_RECREATED = "KEY_IS_ACTIVITY_RECREATED";
/** true if this activity is recreated. */
private boolean isActivityRecreated = false;
// Call this method when you want to recreate this activity.
private void recreateActivity() {
isActivityRecreated = true;
recreate();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(KEY_IS_ACTIVITY_RECREATED, isActivityRecreated);
outState.putInt(Constants.VIDEO_ID, videoId);
outState.putInt(Constants.CATEGORY_ID, categoryId);
}
第2步:检索onRestoreInstanceState
或中的数据onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
isActivityRecreated = savedInstanceState.getBoolean(KEY_IS_ACTIVITY_RECREATED);
if (isActivityRecreated) {
// This activity has been recreated.
// Reset the flag
isActivityRecreated = false;
// Write your code when this activity recreated.
int videoId = savedInstanceState.getInt(Constants.VIDEO_ID);
int categoryId = savedInstanceState.getInt(Constants.CATEGORY_ID);
...
}
}
}
解决方法
重新启动活动时,onStop()
上一个活动的延迟太多,无法调用。
我正在使用此代码重新启动我的活动 PlayerActivity.java
Intent playerIntent = getIntent();
playerIntent.putExtra(Constants.VIDEO_ID,videoId);
playerIntent.putExtra(Constants.CATEGORY_ID,categoryId);
playerIntent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(playerIntent);
让我们分别调用 PreviousPlayerActivity 和 NewPlayerActivity
,之前的活动以及新的活动。(请记住,它们是相同的PlayerActivity)。
序列
重新启动应用程序时,将在activity-lifecycle中遵循此流程。
PreviousPlayerActivity onPause() -->
NewPlayerActivity onCreate() -->
NewPlayerActivity onStart() -->
NewPlayerActivity onResume() -->
NewPlayerActivity performs a heavy operation -->
PreviousPlayerActivity onStop() -->
PreviousPlayerActivity onDestroy()
我需要的
我需要在NewPlayerActivity启动之前完成销毁PreviousPlayerActivity。但是,onStop()
由于在繁重的操作之后才被调用,因此延迟了大约10秒的调用时间。
我尝试了什么
如果我使用recreate()
方法,则它确实会在调用NewPreviousActivity之前销毁PreviousPlayerActivity,但是通过调用recreate()
我无法将Extras放入新的活动实例中。
问题
- 重新启动活动时如何完全销毁PreviousActivity?
- 使用时有没有办法放置putExtras
recreate()
?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。