activity 的四种启动模式和 onNewIntent()

Android 中 Activity 启动模式详解

  
  Android 中 activity 的启动模式可以在 Manifest.xml 中定义 activity 的 launchMode 属性,可以分为四种:

  1. standard
    默认启动模式,每次启动 activity 时都会创建该 activity 的实例,并入栈。一个任务栈可以有多个实例,每个实例可以属于不同的任务栈(如A启动B, C启动B, A和C属于不同的栈,则B实例也属于不同的栈)。谁启动了activity,该activity就运行在启动他的那个activity所在的栈中。

  2. singleTop
    栈顶复用、单实例。如果在任务的栈顶正好存在该 activity 的实例, 就重用该实例,否则就会创建新的实例并入栈。
    (即使栈中已经存在该 activity 实例,只要不在栈顶,都会创建实例)。

  3. singleTask
    栈内复用、单实例。 如果所要启动的 activity 所需要的栈中已经有该 activity 的实例,就重用该实例(并调用 onNewIntent() 方法)。否则,先看是否存在所需的栈,不存在就创建栈,再看栈中有没有实例,没有实例就创建实例并入栈;有实例则复用。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈(clearTop)。

  4. 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

猜你喜欢

转载自blog.csdn.net/hust_twj/article/details/79456366