终于撇开恶心的业务代码,有时间来复习下android知识了,笔者也属于那种,间歇性雄心斗志,持续性混吃等死,的人,天天加班干到深夜,都 ™ 没时间学习,复习一些知识了,本篇文章也是一种记录,一种备忘,要是一不当心帮助到了别人,想必也是极好的,笔者知识有限,也在学习,不免纰漏,万望海涵,请指正,行,废话就到这儿吧!android
什么? 朕的大秦灭亡啦? 你™ 还在讲这种垃圾知识点?面试
这种知识点,你们都知道,可是面试,尤为是那种中小型公司问一些基础时,冷不丁给你问一句,4种启动模式,虽然都差很少,但有些细微的差异,很容易搞混淆,彻底能够不用细究,直接收藏保存,之后想看的时候过一遍就行。笔者也是,总是记不住(也不必记),须要的时候翻出来看看就行。这也是我记录的缘由。shell
这是最普通,系统默认的启动方式,通常咱们开发若是没有特殊需求这种模式是使用的最多的,startActivity
的时候Activity依次入栈,按下返回键 后进先出 依次回退。相似于这样:学习
这里给你们推荐一个 ADB 命令能够直接查看到Activity的堆栈信息:adb shell dumpsys activity
google
这个时候咱们能够看见,只有一个Activity栈,栈中的Activity排列,以及顶部的
Activity(FourthActivity)
:spa
该模式和
standard
模式只有一点点区别:
该Activity在栈顶:.net
若是该Activity就在栈顶, 那么再次
startActivity
的时候,并不会再开一个Activity而是,直接从新走该Activity的onNewInstance
方法!code
该Activity不在栈顶:xml
由其余Activity去
startActivity
该Activity,那么走的仍是standard
模式的规则blog
就像这样:
这里面的A_Activity
就是singleTop
启动模式,且咱们能够从先后两个堆栈信息里面看到Activity的状况:
这里咱们有4个Activity 分别为A、B、C、D,其中B为SingleTop模式,
这个时候,不会在去启动新的B,而是直接走了onNewIntent
方法。
该模式下的Activity会被 放入一个新的栈中,而且 该栈中,仅只有该Activity。
就像这样:
经过ADB命令查看:
onNewIntent
。若是使用过该模式的同窗应该都遇到过坑,直接设置Androidmanifest.xml文件中的
launchMode
以后启动发现并非在一个新的栈中:
什么状况? 不是在一个新的栈中吗? 其实经过源码研究,在ActivityStack
中会对被启动的Activity的taskAffinity进行判断所形成的,对于想深刻研究的请移步singleTask之谜。,对于这个问题google官方也有一些说明。该模式不适合大多数应用。
既然这样, 咱们给被启动的Activity加上属性taskAffinity相似于这样:
<activity android:name=".B_Activity" android:launchMode="singleInstance" android:taskAffinity="cn.lxw.activitylaunchersequenceB" />
完成以后再来看看堆栈信息: