Activity启动模式

Activity启动模式是作为一名Android开发者的需要知道的最基本知识点,也是面试被问烂了的,不过有一些细节并需要重点关注。

四种启动模式

Activity的四种启动模式:Standard、SingleTop、SingleTask、SingleInstance
Standard:最常用的模式,每次启动一个Activity就新建一个Activity实例,添加进ActivityTask中
SingleTop:每次启动一个Activity时,判断Activity栈顶是否是该Activity的实例,如果是,则直接通过newIntent复用Activity实例;如果不是,和Standard模式一样,新建一个Activity实例。该模式称为栈顶复用,开发中使用的场景:搜索页,连续多次打开搜索页,不可能每次都启动一个搜索页Activity,否则用户搜索完按Back键需要多次。
SingleTask:每次启动一个Activity时,判断Activity栈内是否存在该Activity的实例,如果存在,直接通过newIntent复用,并且在该Activity之前的其他Activity实例出栈,如果不存在,新建一个Activity实例。该模式称为栈内复用,使用场景:App内的主页,用户到达主页,再按Back键,就退出App,而不是退出上一个界面。
SingleInstance:每次启动一个Activity,该Activity实例新建一个Activity栈,并且栈内只有该Activity,目前我没有遇到这种用法。

细节

  在Android5.0之前,设置Activity的启动模式会对startActivityForResult带来影响,如果ActivityB的启动模式设置为SingleTask或者SingleInstance,ActivityA通过startActivityForResult启动ActivityB,ActivityA中的onActivityForResult马上会收到B的返回值,且data=null,resultCode=0,0代表ResultCanceled。
  在Android5.0之后该问题得到修复。这是因为ActivityStackSupervisor类中的startActivityUncheckedLocked方法在5.0中进行了修改。在5.0之前,当启动一个Activity时,系统将首先检查Activity的launchMode,如果为A页面设置为SingleInstance或者B页面设置为singleTask或者singleInstance,则会在LaunchFlags中加入FLAG_ACTIVITY_NEW_TASK标志,而如果含有FLAG_ACTIVITY_NEW_TASK标志的话,onActivityResult将会立即接收到一个cancle的信息,而5.0之后这个方法做了修改,修改之后即便启动的页面设置launchMode为singleTask或singleInstance,onActivityResult依旧可以正常工作,也就是说无论设置哪种启动方式,StartActivityForResult和onActivityResult()这一组合都是有效的。所以如果你目前正好基于5.0做相关开发,不要忘了向下兼容,这里有个坑请注意避让。

你可能感兴趣的:(Activity启动模式)