- 实验内容:
在不同的launch模式下,点击‘home’后,再长按Home后的activity的执行顺序是不一样的。
实验代码:
public class TestActivity extends Activity {
private String TAG = "TestActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(TAG, "onCreate"+ this.toString());
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume"+ this.toString());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(TAG, "onNewIntent"+ this.toString());
}
public void a(View view) {
startActivity(new Intent(TestActivity.this, TestActivity.class));
}
}
- 不同情况下实验结果:
1。 TestActivity的launchMode的值定义为“standard”,或者不填(默认就为standard)
分析: 第一条线: 启动程序执行OnCreate和OnResume。
第二条线: 点击按钮,执行a方法。 第一个TestActivity执行onPause,并启动新的TestActivity,执行OnCreate和OnResume。
第三条线:点击‘home’键,执行OnPause。
第四条线:长按“HOME”,执行OnResume。且activity为之前关闭的activity。
2。 TestActivty的launchMode的值定义为“singleTop、singleTask,singleInstance”。下图为singleTask实例:
分析: 第一条线: 启动程序执行OnCreate和OnResume。
第二条线:点击按钮,执行a方法。 第一个TestActivity执行onPause,并启动新的TestActivity,由于设置了launchMode,在设置的当前情况下不需要重新创建新的activity。便执行onNewIntent和OnResume。
第三条线:点击‘home’键,执行OnPause。
第四条线:长按“HOME”,执行onNewIntent和OnResume。且activity为之前关闭的activity。
- 实验结论
1。OnNewIntent方法是在创建目标Activity已经存在,无需再次创建的时候调用,代替了OnCreate方法。
2。当activity的launchMode的模式在非standard模式下,长按HOME键,是调用onNewIntent()-》OnResume()
PS:
Intent intent = new Intent(TestActivity.this, TestActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
即使代码的Intent中加入了FLAG_ACTIVITY_NEW_TASK也不会影响前面的结论。 (即使加入了FLAG_ACTIVITY_NEW_TASK参数,仍然是在standard模式下调用onCreate方法。在非standard模式下,满足情况就只调用onNewIntent);