今天介绍一道Android初级面试题,关于Android app的启动模式。
Android Activity的四种启动模式
Activity的四种启动模式想必入门安卓开发一两年的都了解, · standard · singleTop · singleTask · singleInstance
今天总结一下这几个之间的区别
Android的Task,可以理解为UI的栈。以最简单的情况来说,A B C都是standard模式启动的Activity,他们的启动顺序 A->B->C,那么在栈中就会以启动顺序入栈。
当点返回键的时候,又会以入栈顺序出栈,这时候对于用户来说就会看到之前的 Activity了。
解释了 Task的概念,接下来解释启动模式的作用
标准启动模式,也是activity的默认启动模式。在这种模式下启动的activity可以被多次实例化,即在同一个任务中可以存在多个activity的实例,每个实例都会处理一个Intent对象。如果Activity A的启动模式为standard,并且A已经启动,在A中再次启动Activity A,即调用startActivity(new Intent(this,A.class)),会在A的上面再次启动一个A的实例,即当前的桟中的状态为A->A。
singleTop的意思可以理解为在栈顶只有一个实例对象。当再次启动时若栈顶已经有,那么不会实例化一个新的,而是调用它的 onNewIntent()方法。 而如果这个对象不在栈顶,则会再启动一个新的 Activity入栈,栈里旧的 activity不会被重用。
官方解释,启动方式为 singleTask的 activity,只会在系统中存在一个对象。当启动它时,总会在一个新的任务(Task)的最底部启动这个 activity,并且由它启动的其他 activity也会在这个任务栈(Task)中。
如果系统中已经有一个 singleTask 的实例,那么再次启动时会重用它,并且调用它的 onNewIntent()方法。
补充
,官方解释并没有说明 taskAffinity属性对 singleTask的影响。
如果不设置 taskAffinity属性的话,即使设置为 singleTask,也会在原有的栈中实例化 Activity
所以 singleTask需要配合 taskAffinity使用才有效果
这个很好理解。就是在系统中只会有一个单例存在。任何时候启动 activity如果系统中已经有目标 activity,则调用它的 onNewIntent()方法。
关于 singleTask还有个有趣的东西。在不设置 taskAffinity的情况下,假设启动 activity的顺序是 A->B->C->D->B,而B设置了 singleTask,那么在最后启动完 会发生什么事呢? 其实面试经常考这个点。最后的结果,栈会变成只有 A->B这样子,而 C和 D会被弹出栈。这样满足了 singleTask的属性 既 single in task!