In 活动生命周期来自 Android 开发者指南。
协调活动
当一项活动启动另一项活动时,它们都会经历生命周期
过渡。第一个 Activity 停止运行并进入 Paused
或已停止状态,同时创建其他活动。万一这些
活动共享保存到光盘或其他地方的数据,这一点很重要
了解第一个活动之前没有完全停止
第二个已创建。相反,启动第二个过程
其中一个与停止第一个的过程重叠。
生命周期回调的顺序是明确定义的,特别是当
这两个活动位于同一进程(应用程序)中,其中一个正在启动
另一个。以下是活动 A 时发生的操作顺序
开始活动 B:
- 活动A
onPause()
方法执行。
- 活动B
onCreate()
, onStart()
, and onResume()
方法按顺序执行。 (活动 B 现在具有用户焦点。)
- 然后,如果 Activity A 在屏幕上不再可见,则其
onStop()
方法执行。
这种可预测的生命周期回调序列使您能够管理
信息从一项活动转移到另一项活动。
因此,您所描述的行为是预期的或可预测的。
回到你的问题。
1.重启Activity时如何彻底销毁之前的Activity?
- Using recreate API, 限制是它仅适用于 API 11 或更高版本
2.有没有办法在使用recreate()时放置Extras?
recreate
public void recreate ()
导致使用新实例重新创建此 Activity。这个结果
本质上与由于以下原因创建活动时的流程相同
配置更改——当前实例将经历其
生命周期到 onDestroy() 并在其后创建一个新实例。
因为该活动将被重新创建,所以保存实例状态 and 恢复实例状态也会被调用。正如你可以猜到的,这个想法是将数据保存在onSaveInstanceState
并检索到onRestoreInstanceState
or 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
or 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);
...
}
}
}