Activity
启动模式
Activity启动模式分为四种:
standard
、singleTop
、singleTask
、singleInstance
。为了观察Activity在各启动模式下的生命周期,在相关文件添加相应log
,代码如下 :
public class MainActivity extends BaseActivity {
private static final String TAG = MainActivity.class.getSimpleName();
@OnClick(R.id.btn_launch_main)
void launchMyself() {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
KomaLog.i(TAG, "onCreate taskId : " + getTaskId());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
KomaLog.i(TAG, "onNewIntent taskId : " + getTaskId());
setIntent(intent);
}
@Override
protected void onStart() {
super.onStart();
KomaLog.i(TAG, "onStart taskId : " + getTaskId());
}
@Override
protected void onResume() {
super.onResume();
KomaLog.i(TAG, "onResume taskId : " + getTaskId());
}
@Override
protected void onPause() {
super.onPause();
KomaLog.i(TAG, "onPause taskId : " + getTaskId());
}
@Override
protected void onStop() {
super.onStop();
KomaLog.i(TAG, "onStop taskId : " + getTaskId());
}
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
}
public class SecondActivity extends BaseActivity {
private static final String TAG = SecondActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
KomaLog.i(TAG, "onCreate taskId : " + getTaskId());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
KomaLog.i(TAG, "onNewIntent taskId : " + getTaskId());
setIntent(intent);
}
@Override
protected void onStart() {
super.onStart();
KomaLog.i(TAG, "onStart taskId : " + getTaskId());
}
@Override
protected void onResume() {
super.onResume();
KomaLog.i(TAG, "onResume taskId : " + getTaskId());
}
@Override
protected void onPause() {
super.onPause();
KomaLog.i(TAG, "onPause taskId : " + getTaskId());
}
@Override
protected void onStop() {
super.onStop();
KomaLog.i(TAG, "onStop taskId : " + getTaskId());
}
@Override
protected int getLayoutId() {
return R.layout.activity_second;
}
}
standard
标准模式当我们在manifest中activity标签下未指定
android:launchMode
时,系统默认启动模式则为standard,相当于设置android:launchMode="standard"
。在这种模式下,每次启动该activity时系统都会为其创建一个实例(依次回调onCreate、onStart、onResume
),不管这个实例是否已经存在。onNewIntent
方法永远不会调用,且taskId也不会改变。singleTop
栈顶复用模式在这种启动模式下,只要被启动的Activity不位于栈的顶部,该Activity就会被创建入栈。
如果被启动的Activity不位于栈顶,其生命周期回调如下:04-04 01:18:55.234 29157 29157 I KomaLog : MainActivity----onCreate taskId : 1989 04-04 01:18:55.236 29157 29157 I KomaLog : MainActivity----onStart taskId : 1989 04-04 01:18:55.239 29157 29157 I KomaLog : MainActivity----onResume taskId : 1989
通过
log
看在这种情况下,每次被启动时Activity都会重新创建,会回调onCreate
,但是不会回调onNewIntent
。如果被启动的Activity位于栈顶,该活动的实例就不会被创建,若当前Activity未回调onStop时(当前Activity未处于停止状态),其生命周期回调如下:
04-04 01:21:35.407 29157 29157 I KomaLog : MainActivity----onNewIntent taskId : 1989 04-04 01:21:35.411 29157 29157 I KomaLog : MainActivity----onResume taskId : 1989
若当前Activity位于栈顶,且已回调onStop(处于停止状态),其生命周期回调如下:
04-04 01:22:31.201 29157 29157 I KomaLog : MainActivity----onNewIntent taskId : 1989 04-04 01:22:31.202 29157 29157 I KomaLog : MainActivity----onStart taskId : 1989 04-04 01:22:31.204 29157 29157 I KomaLog : MainActivity----onResume taskId : 1989
singleTask
栈内复用模式当Actvity在栈中没有实例时,其生命周期调用如下:
04-04 02:39:01.563 31129 31129 I KomaLog : MainActivity----onCreate taskId : 1992 04-04 02:39:01.565 31129 31129 I KomaLog : MainActivity----onStart taskId : 1992 04-04 02:39:01.568 31129 31129 I KomaLog : MainActivity----onResume taskId : 1992
当Activity在栈中已存在实例时,且未回调onStop(未进入停止状态时)其生命周期调用如下:
04-04 02:44:55.691 31129 31129 I KomaLog : MainActivity----onNewIntent taskId : 1992 04-04 02:44:55.692 31129 31129 I KomaLog : MainActivity----onResume taskId : 1992
当Activity在栈中已存在实例时,且已回调onStop(进入停止状态时)其生命周期调用如下:
04-04 02:45:47.441 31129 31129 I KomaLog : MainActivity----onNewIntent taskId : 1992 04-04 02:45:47.443 31129 31129 I KomaLog : MainActivity----onStart taskId : 1992 04-04 02:45:47.444 31129 31129 I KomaLog : MainActivity----onResume taskId : 1992
由此可见当Activity在singleTask(栈内复用模式)下,只要Activity实例在一个栈中存在,那么多次启动该Activity都不会创建其实例(即不会回调
onCreate
);当其实例在栈中已存在时,再次启动该Activity会回调onNewIntent
方法,但是taskId
是不会改变的。
singleInstance
单实例模式singleInstance
单实例模式是一种增强型singleTask
模式,其除了具有singleTask
模式的所有特性外,还加强了一点,具有此种模式的Activity
只能单独地位于一个任务栈中。onNewIntent
方法的调用时机也和singleTask
一样,当栈内有其实例才会调用onNewIntent
,在此就不一一列出。