Android启动模式需要注意的点

Android的四种启动模式大家都比较清楚,就是standard、singleTop、singleTask、singleInstance,接下来说下其中需要注意的点

  1. singleTop、singleTask、singleInstance启动模式的Activity被多次通过Intent方式进入后,不会重复onCreate而是执行onNewIntent方法;
  2. 启动顺序为:ActivityA->ActivityB(SingleInstance )->ActivityC ,点击Back退出顺序:C-》A-》B
    启动顺序为:ActivityA->ActivityB(SingleInstance ),点击HOME键再切回应用,展示A而不是B。
    解决方式是一样的:
    在ActivityB定义一个全局变量,public static boolean returnActivityB;在onCreate方法将returnActivityB=true;
    然后在ActivityA界面onStart方法里判断returnActivityB是否为true,是的话就跳转到ActivityB,同时将returnActivityB=false;这样就能解决跳转的问题了。

3.防止singleInstance模式的Activity被销毁:

@Override
public boolean onKeyDown(int keycode, KeyEvent event) {
    L.e("Key_Stuta = " + event.getAction());
    if (keycode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        // 右键处理
        moveTaskToBack(true);
    }
    return true;
}
  1. startActivityForResult启动singleTask的Activity,则onActivitResult()立即回调且resultCode为RESULT_CANCEL
  2. 设置了"singleTask"启动模式的Activity,它在启动的时候,会先在系统中查找属性值taskAffinity等于它的属性值taskAffinity的任务存在;如果存在这样的任务,它就会在这个任务中启动,否则就会在新任务中启动。因此,如果我们想要设置了"singleTask"启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。
  3. 如果设置了"singleTask"启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的Activity实例,如果存在,就会把位于这个Activity实例上面的Activity全部结束掉,即最终这个Activity实例会位于任务的堆栈顶端中
  4. 之所以用 onNewIntent(Intent intent) 而不是在 onResume() 中通过调用 getIntent()获取最新Bundle中的信息,是因为 getIntent获取的是第一次启动时传入的一些旧的参数信息,最新的跳转信息如 intent.putExtra(“setting”, “1”); 需要在onNewIntent传入的intent参数中取出
  5. SingleInstance模式的应用场景:
    假设程序中有一个activity是允许其它程序调用的,如果想使其它程序和这个程序共享这个activity的实例,使用其它三种启动模式是不行的,因为每个应用程序都有自己的返回栈,同一个activity在不同的返回栈中入栈时必然是创建了新的实例。而使用singleInstance模式可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个activity,不管是哪个应用程序来访问这个activity,都共用同一个返回栈,也解决了共享活动实例的问题。

你可能感兴趣的:(Android基础)