activity四种启动模式:
首先明确一点activity一定是依附于某个任务栈才能存在的 默认情况下一个应用内的activity都在一个任务栈里 可以通过Android:taskAffinity来修改它的任务栈
1:standard 每次启动都重新实例化一个实例
2:singletop 栈顶复用模式,如果要开启的activity在任务栈的顶部已经存在,就不会创建新的实例,而是调用 onNewIntent() 方法。避免栈顶的activity被重复的创建。
3:singletask 栈内复用模式 如果要激活的activity,在任务栈里面已经存在,就不会创建新的activity,而是复用这个已经存在的activity,调用 onNewIntent() 方法,并且清空这个activity任务栈上面所有的activity。
如果在清单文件中配置Android:taskAffinity="新的包名"
,因为Android:taskAffinity
这个字段默认指定的包名为本应用的包名,表示在本应用包名的任务栈内创建应用。如果设置了这个字段,而且还和本应用包名不同,就会在新的任务栈创建任务。
4:singleinstance 全局唯一实例 单独存在一个栈内。不同的应用去打开这个activity 共享公用的同一个activity。他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。
以上只是一些基础概念,如果以为知道这些就了解了activity的启动模式,那么只能说too young too simple。
以下列举在开发中实际出现的一些问题:
1:activityA 通过startactivityforResult ->启动activityB(singletash|singleinstance)。
activityA并不会收到结果返回值
2:关于singletask在mainactivity与非mainacitvity时候
两种情况
1:main Activity ->启动a(singletask)->启动b 然后按HOME(不是back)回到桌面
然后再次点开应用显示acitvityb
2:main(singletask) ->启动b 按HOME(不是back)回到桌面 再次点开应用显示main
打印log发现当按下HOME后 b:onpause->onstop
再次点开应用 b:执行ondestroy
main:执行onNewIntent->onrestart ->onstart->onreusme