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