前言
Android的Activity的启动启动模式在面试也是常常被问到的,本人面试几家公司都有问到,比如面试管问:当在应用中的ActivityA跳转到ActivityB,然后按下home键跳到桌面,这时当点击应用图标回跳到应用,当前应用显示的是哪个Activity?面试管问这样的问题可能是考你关于Activity的启动模式的了解,其实面试管想知道四种启动模式分别会产生什么结果。首先举例一个特殊的启动模式,如如果ActivityB的启动模式是singleInstance,回到应用当前展现的视图是ActivityA页面,想知道原因就需要了解这四种启动模式的原理,往下看。
一、Activity的启动模式简介
Activity有四种启动模式,分别是standrad、singleTop、singleTask、singleInstance,默认的启动模式是standrad。
修改启动模式就是在AndroidManifest.xml文件清单文件中修改launchMode的属性,如图下图:
1.0 standard 模式
该模式是Activity的默认模式,一个Activity的启动模式设置为standard时,每启动一次该Activity都会创建一个实例,并加入到启动该Activity的那个任务栈顶。如下图1.0就是开启一个新的Activity的入栈顺序:Activity1-Activity2-Activity3
退出栈的顺序如下图:
1.1 singleTop 模式
singleTop是一种栈顶复用启动模式,设置这种模式的Activity,如果栈顶已经有该Activity,当新创建该Activity就不会重新创建实例,只会回调onNewIntent方法。如下图:
1.2 singleTask 模式
singleTask是一种栈内复用的启动模式,创建该模式Activity的时候,任务栈要是存在该Activity实例,直接复用已存在的实例,并回调onNewIntent方法,而且会把该Activity之上的Activity移除出栈。如果不存在则新创建实例加入任务栈顶。
如下图,当任务栈中有Activity1和Activity2,Activity1是singleTask启动模式,要是在当前任务栈中再启动一个新的Activity1,因为已经存在Activity1,直接复用,把Activity2移除。
taskAffinity属性
taskAffinity一般和singleTask或者和allowTaskReparenting属性配合使用,当在application和activity中没有指定taskAffinity属性值时,默认任务栈名字为当前包名,要是application制定了taskAffinity任务栈名字,则所有Activity默认是该名字。
1.3 singleInstance模式
单例实例启动模式,设为该启动模式的Activity会存在一个单独的任务栈中,而以上三种启动模式开启新的Activity都存在同一个任务栈中,比如Activity1开启一个Activity2,Activity2是存在新开的任务栈中,
常遇到的坑:
列子1:比如应用第一个页面是Activity1,是默认的standard模式,Activity1开启一个新的Activity2,Activity2是singleInstance启动模式,这时按手机的home按键调到桌面,当从桌面点击图标进入应用时,当前打开的页面是Activity1。出现这样的现象原因,由于退到桌面在进入应用,系统默认启动的是Luancher中Activity的栈,Activity1就是Luancher中的一个任务栈,所以优先启动Activity1,主栈中的所以Activity销毁后,才会回到Activity2所在的栈中显示。