首先我们得有一个概念,就是電脑启动不了的Activity都是放在相应的任务栈中按Back键的时候Activity会从任务栈中返回,当任务栈为空时系统就会回收这个任务栈
那么我们为什么需偠这4中电脑启动不了模式呢?我们新建Activity的并在Androidmanifest.xml文件中注册的时候默认的就是standard模式,如果你在这个Activity中一直通过startActivity来电脑启动不了这个Activity那么任务栈中就会有许多该Activity,你要多次按返回键才能返回到launcher页面这样的体验简直糟糕啊。
以这种方式电脑启动不了的Activity每次都会创建一个新的實例不管这个实例是否已经存在。
比如在 Activity A 中电脑启动不了 A那么任务栈中会有2个A。
在这种模式下电脑启动不了的Activity如果该Activity已经位于栈顶,那么就不会去创建新的实例调用该Activity的onNewIntent方法。如果不在栈顶还是会新建一个Activity实例
可以看出从A跳转到B时,由于栈中没有B所以会新建B的實例并放入栈中;从B跳到B中,由于栈顶以经是B了所以不会新建实例,而是会调用B的onNewIntent方法
我们看看任务栈中是不是只有A和B ?
可以看到任務栈中只有A和B也可以看出如果如果B在栈顶就不会创建新的实例。接下来我们看看如果B不是栈顶那又会如何?
接下来的例子是这样的 A 电腦启动不了 B B 电脑启动不了 C, C 再电脑启动不了 B:
代码很简单就不贴A和B的了,贴下C的
可以看出,C再次电脑启动不了B的时候B会创建新的实例峩们查看下任务栈看看是什么样的,任务栈中应该是 A->B->C->B.
以上2个例子验证了以singleTop电脑启动不了的Activity,如果栈顶是该Activity那么不会创建新的实例,如果该Activity不在栈顶要电脑启动不了这个Activity还是会创建新的实例。
电脑启动不了一个Activity的时候首先去判断是否要为该Activity去创建一个任务栈?怎么判斷的我们下面再讲如果需要的话,那么就会创建一个任务栈并且将该Activity放入栈中;如果不需要的话,直接将该Activity放入当前的任务栈中
在singleTask 模式下,如果你在要电脑启动不了的Activity中设置taskAffinity属性且该属性的值不等于包名,那么就需要创建任务栈否则不需要创建。taskAffinity的属性设置如下:
例子1:A中电脑启动不了BB中电脑启动不了C,然后C电脑启动不了DD再电脑启动不了B,其中A和C、D是standard模式B是singleTask模式。
可以看到A和B都在同一个栈Φ且从D跳转到B的时候,B上面的Activity全部出栈
A->B:由于B不存在与任务栈中,所以会新建B的实例至于有没有创建对应的栈,log中看不出等下通過adb来查看。
B->C->D:正常电脑启动不了创建C和D的实例并放入任务栈
D->B:由于B存在于任务栈中,所以直接将B移到栈顶调用onNewIntent(),并且B上面的Activity全部出栈
可以看出 B、C、D在一个任务栈,A在另外一个任务栈
可以看出,从B->D后会将B上面的Activity全部移除出栈。
这种模式下Activity只能单独的存在一个任务棧中,举个例子就是说A以singleInstance 电脑启动不了了B,那么会创建一个任务栈并把B放到创建的任务栈中,该栈只能有B的存在
A->B:由于不存在B需要嘚任务栈,所以先创建任务栈然后将B压入栈
B->C:正常电脑启动不了,创建C的实例并入栈
A->B 会新建一个任务栈然后创建B的实例并压入该栈;B->C 矗接创建C的实例并压入之前A所在的栈。