android对启动模式的深入了解

来源:互联网 发布:淘宝产品拍摄相机选择 编辑:程序博客网 时间:2024/05/22 03:35

引言

由于网络上对android启动模式有各种解释,苦于没有一个良好的整理概括,所以很多初学者对启动模式感觉非常的遥远。我想做的就是把LaunchMode更加通俗的介绍给大家。

正文

a、直接跳入正题,开始动手解剖启动模式吧!对于4种activity的启动模式,只要接触过android启动模式的开发,就肯定知道:
1.standard模式,如果在AndroidManifest.xml中没有配置这个activity的启动模式,则activity的默认就是该启动模式。这个应该很好理解,Aactivity通过内部button跳转到Aactivity,则在Task中存在两个Aactivity的实例,即需要按两次Back键才能会退到做面。这个模式真的很简单,以至于我们都不需要去讨论他。
2.singleTop模式,代表栈顶模式。设置a、b、c三个activity,b在xml中配置为singleTop模式,从a跳b跳c,则栈顶到栈底的activity依次为:cba;从a跳b跳b跳c,则栈顶到栈底的activity依次为cba,两次的结果居然相同,原因是在b跳到b的过程中,因为此时b在栈顶,会重用b而不会重新生成b的实例(跳到第二个b的时候会调用他的onNewIntent方法,而不会调用oncreate之类的)。使用场景:网易新闻客户端,在notification中的新闻推送,如果有10个推送新闻,点击跳转到新闻界面,总不可能连续生成10个显示新闻的activity界面吧,所以可以用singleTop模式来解决。

3.singleTask模式,代表站内单一实例。设置a、b、c三个activity,b在xml中配置为singleTask模式,a跳b跳c跳b,则栈顶到栈底的变化依次为:a;ba;cba;ba。由于在栈中存在b实例,在最后跳转到b的时候会复用栈内的b实例,由于栈的先进后出特性,在重用b实例的时候由于他上面还有c实例存在,由于栈的先进后出特性,所以会把b以上的所有实例都直接退栈,由于栈的先进后出特性,此过程会调用b的onNewIntent方法。使用场景:个人觉得微信的主界面、网易新闻的主界面都应该是singleTask模式的。
4.singleInstance模式,他具有singleTask的特点,而且这种模式的activity只能单独的位于一个任务栈中。暂时没有找到对应的使用场景。

b、当然和启动模式分不开的还有Intent中启动模式对应的Flags。
1.FLAG_ACTIVITY_NEW_TASK:这个标记和singleTask启动模式效果一样。在实际操作中,非activity的context启动activity的话必须要添加该flag(比如service中开启activity、broadcast中开启activity)。有abc三个activity,xml中都是默认的启动模式,在a跳到b的过程中addFlags添加这个flag。跳转过程a-b-c-b,则栈顶到栈底的变化依次为:a;ba;cba;bcba。这时候疑问就来了,为什么和singletask模式的栈消息不同?这里说明一下:a跳到b的过程中,只是说明这个b的启动模式通过flag设置为singletask形式的,而在c调到b的过程中,由于这个b是standard的,所以c调到b不会去栈中找原先就存在的b,而是直接重新生成了b。
2.FLAG_ACTIVITY_SINGLE_TOP:这个模式和singleTop模式一模一样。
3.FLAG_ACTIVITY_CLEAR_TOP:把位于这个activity之上的所有都清除出栈。如果该activity是standard的,则会把它自己和以上的所有activity都清理,并重新生成该activity。如果该activity是singleTask的,则会把它以上的activity清理出栈,并且重新调用该activity的onNewIntent方法,而不会重新生成该activity。

4.FLAG_ACTIVITY_CLEAR_TASK:则要跳转到的activity将变成一个栈中新的最底端的activity,所有的旧activity都会被finish掉,但是这个标识仅仅和FLAG_ACTIVITY_NEW_TASK联合起来才能使用。

0 0
原创粉丝点击