activity的启动模式自然不能脱离Activity的任务栈(Task),任务栈(Task)即Application启动时,系统会为Application创建一个任务栈(Task),我们对Activity的打开和关闭操作,就是将Activity压入(push)任务栈和从任务栈中弹出(pop)的操作,任务栈遵循先进后出的原则,在栈顶的Activity就是设备当前显示的Activity。下面切入正题:
1、standard:activity的默认启动模式,起允许很多实例创建。
2、singleTop:相对于standard而言,当有新的请求时,只有在目标activity处理栈顶时,才会调用方法onNewIntent(Intent intent) 而不创建新实例,其他情况都和standard一致。
场景:APP接收到多条推送消息,点开不同消息,均由同一实例展示。
3、singleTask:设置了singleTask启动模式的Activity,它在启动的时候,会先在系统中查找属性值affinity等于它的属性值taskAffinity的任务是否存在;如果存在这样的任务,它就会在这个任务中启动,否则就会在新任务中启动。因此,如果我们想要设置了singleTask启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。如果设置了singleTask启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的Activity实例,如果存在,就会把位于这个Activity实例上面的Activity全部结束掉,即最终这个Activity实例会位于任务的堆栈顶端中。
场景:APP的主页
4、singleInstance:和singleTask相比,不同点在于设置了singleInstance 的 activity所在的Task只会有这一个activity。
场景:如APP经常调用的拨打电话、系统通讯录、地图类APP 等页面,不同APP调用此类Activity 时,首次创建实例,之后其他APP只能复用此实例。
一般而言,singleTask与singleTop都是为了保证Activity在任务栈中的唯一性。