Android 中 Activity 启动模式详解
Android 中 activity 的启动模式可以在 Manifest.xml 中定义 activity 的 launchMode 属性,可以分为四种:
standard
默认启动模式,每次启动 activity 时都会创建该 activity 的实例,并入栈。一个任务栈可以有多个实例,每个实例可以属于不同的任务栈(如A启动B, C启动B, A和C属于不同的栈,则B实例也属于不同的栈)。谁启动了activity,该activity就运行在启动他的那个activity所在的栈中。singleTop
栈顶复用、单实例。如果在任务的栈顶正好存在该 activity 的实例, 就重用该实例,否则就会创建新的实例并入栈。
(即使栈中已经存在该 activity 实例,只要不在栈顶,都会创建实例)。singleTask
栈内复用、单实例。 如果所要启动的 activity 所需要的栈中已经有该 activity 的实例,就重用该实例(并调用 onNewIntent() 方法)。否则,先看是否存在所需的栈,不存在就创建栈,再看栈中有没有实例,没有实例就创建实例并入栈;有实例则复用。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈(clearTop)。singleInstance
加强的singleTask,强制创建新的任务栈。
在Manifest.xml中设置 Activity启动模式:
<activity android:name=".MainActivity" android:launchMode="standard" />
onNewIntent
当 lanuchMode 不为 standard 时,Activity第一次启动的时候会依次执行onCreate()---->onStart()---->onResume()
等生命周期,不会执行到onNewIntent()。 后面如果再要启动该 activity,那就是执行onNewIntent()---->onResart()------>onStart()----->onResume()
,而onCreate()
不会执行。
当调用到 onNewIntent(intent)
的时候,需要在onNewIntent() 中使用setIntent(intent)
赋值给 activity 的Intent,否则,后续的getIntent()
都是得到老的Intent:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);//必须保存新的intent,否则getIntent()会返回老的intent
setContentView(R.layout.activity_main);
processExtraData();
}
注意,系统可能会随时杀掉后台运行的 activity ,如果这一切发生,那么系统就会调用 onCreate 方法,而不调用onNewIntent方法,一个好的解决方法就是在 onCreate() 和 onNewIntent 方法中调用同一个处理数据的方法,如下所示:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
processExtraData();
}
private void processExtraData(){
Intent intent = getIntent();
//use the data received here
}
转自:
1、http://blog.csdn.net/linghu_java/article/details/17266603
2、http://blog.csdn.net/lihenair/article/details/28892921