APP二次启动问题
2016-08-24 14:13
113 查看
这两天突然在考虑一个问题,就是APP在按了HOME键之后再点击应用图标(进程没被杀死的情况下)是如何恢复到刚才打开的界面的。按理来说在lanucher点击应用图标是start有android.intent.action.main这个属性activity,那么为什么能够回到原来打开的界面呢?个人初步猜测是启动模式还有affinity有关。带着问题去看了下网上关于启动流程的分析以及android的源码。
从lanucher里启动的activity默认带有FLAG_ACTIVITY_NEW_TASK属性,所以走进这个if条件,在启动页不是singleinstance的情况下会走到findTaskLockded这个方法里面。
在这个方法里,遍历当前存在的所有task
接下来就是进入这个判断,判断当前栈顶的task和要启动的activity所在的task是否是同一个,由于是从lanucher启动的,当前栈顶的task应该是lanucher所以在的task,所以肯定不是同一个task,所以满足这个条件,然后调用moveTaskToFontLocked,这个就是把要启动的activity所在的task移动到栈顶。然后顺这个看下去,就会看到resumeTopActivitiesLocked这个方法的调用,就是恢复当前task的顶部activity,所以我们看到就是原来点击home键所在的这个界面。
补充一点,就是这个回到原来所在页面的前提是,启动页就是有android.intent.action.main这个属性的页面不能是singletask或者singleintance, singleintance就不用细说了,因为这个属性的activity所在的task里只能存在他本身一个activity实例,恢复到它所在的task看到也只有它一个界面。如果是singletask的话,
则会命中这个条件,会执行清除task的操作,所以同样恢复不了原来的界面。
从lanucher里启动的activity默认带有FLAG_ACTIVITY_NEW_TASK属性,所以走进这个if条件,在启动页不是singleinstance的情况下会走到findTaskLockded这个方法里面。
在这个方法里,遍历当前存在的所有task
接下来就是进入这个判断,判断当前栈顶的task和要启动的activity所在的task是否是同一个,由于是从lanucher启动的,当前栈顶的task应该是lanucher所以在的task,所以肯定不是同一个task,所以满足这个条件,然后调用moveTaskToFontLocked,这个就是把要启动的activity所在的task移动到栈顶。然后顺这个看下去,就会看到resumeTopActivitiesLocked这个方法的调用,就是恢复当前task的顶部activity,所以我们看到就是原来点击home键所在的这个界面。
补充一点,就是这个回到原来所在页面的前提是,启动页就是有android.intent.action.main这个属性的页面不能是singletask或者singleintance, singleintance就不用细说了,因为这个属性的activity所在的task里只能存在他本身一个activity实例,恢复到它所在的task看到也只有它一个界面。如果是singletask的话,
则会命中这个条件,会执行清除task的操作,所以同样恢复不了原来的界面。
相关文章推荐
- Eclipse启动遇到的问题获得解决
- LILO启动问题详解
- Jbuilder总是不能启动的问题
- 求助特难的问题,双系统不能启动xp了
- 红帽9下安装Fcitx后启动特慢问题的解决
- 启动Oracle常见疑难问题分析
- oracle可执行文件s位导致的Cluster资源组无法正常启动的问题解决
- BDK1.1启动时抛错问题。
- winDVD在windows受限用户下启动崩溃问题
- OracleOraHome92Agent启动的问题
- 安装mysql后启动的问题
- 困扰中的vs2003启动问题
- apache-2.0.52自动启动的问题
- 关于解决WebSphere服务不能启动问题的几点经验总结
- 系统启动时蓝屏问题解释
- Resin安装,配置和在Linux上的自动启动问题
- jbuilder2005不能启动问题的解决
- oracle可执行文件s位导致的Cluster资源组无法正常启动的问题解决
- 解决Oracle监听器服务不能启动的问题
- 无法在WEB服务器上启动调试,一个头痛的问题