相关文章:
推荐理由(细致,涉及到task图解,affinity等):细谈Activity四种启动模式
推荐理由(细致、深入):也聊聊activity的launchMode启动模式
推荐理由(细致、深入、侧重flag):Activity的启动模式
推荐理由(全面、基础):带你深入理解Activity启动模式(LaunchMode)
activity的四种启动模式区别_launchmode图文详解
正文:
应用中的每一个Activity都是进行不同的事物处理。以邮件客户端为例,InboxActivity目的就是为了展示收件箱,这个Activity不建议创建成多个实例。而ComposeMailActivity则是用来撰写邮件,可以实例化多个此Activity对象。合理地设计Activity对象是否使用已有的实例还是多次创建,会使得交互设计更加良好,也能避免很多问题。至于想要达到前面的目标,就需要使用今天的Activity启动模式。
Android对Activity的管理:Android采用Task来管理多个Activity,当我们启动一个应用是,Android就会为其创建一个Task,然后启动这个应用的入口Activity (即 < intent-filter…/>)中配置的MAIN和LAUNCHER)。
可以把Task理解为任务栈,Task以栈的形式管理Activity:先入后出。通过调用Activity的getTaskId()的方法来获取他所在Task的ID。
launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例共用一个Task。
a.standard:标准模式、默认模式 [ˈstændərd]
- 含义:每次启动一个Activity就会创建一个新的实例。
- 注意:使用ApplicationContext去启动standard模式Activity就会报错。因为standard模式的Activity会默认进入启动它所属的任务栈,但是由于非Activity的Context没有所谓的任务栈。
b.singleTop:栈顶复用模式
- 含义:如果新Activity已经位于任务栈的栈顶,就不会重新创建,并回调onNewIntent(intent)方法。
- 应用场景一:可以解决重复打开activity的问题,例如 点击注册按钮(500毫秒你点击了两次) , 如果你用系统默认的启动模式, 就会打开2个注册页面,singTop启动模式的意思是开启actiivty的时候系统会先判断此activity是否存在栈顶, 如果存在就激活此实例 因此就可以解决上述的问题。
- 应用场景二:在浏览器的书签 特点:检查栈顶是否存在这个实例 如果存在则不重新创建
c.singleTask:栈内复用模式
- 含义:只要该Activity在一个任务栈中存在,都不会重新创建,并回调onNewIntent(intent)方法。如果不存在,系统会先寻找是否存在需要的栈,如果不存在该栈,就创建一个任务栈,并把该Activity放进去;如果存在,就会创建到已经存在的栈中。
- 应用场景:浏览器主页面 特点:该实例在任务栈只能存在一个,如果再启动,则把上面的Activity实例全部清除。A --> B --> C -->D在D点击返回键,就返回到A。
d.singleInstance:单实例模式
- 含义: 具有此模式的Activity只能单独位于一个任务栈中,且此任务栈中只有唯一一个实例。
- 应用场景:来电显示界面 特点:该实例Activity会创建一个单独的任务栈,且与用户正在交互的界面的任务栈在 前端,直到全部Activity退出.