activity lunchmode详解

转载请注明出处:http://blog.csdn.net/zhouli_csdn/article/details/45645743


看了网上的博客关于launchmode的介绍自己感觉很凌乱,总结性不强(可能自己没找到好的文章),于是自己亲自动手写了两个应用A和B测试:

本人一下内容都经过实际的测试:(通过两个应用测试)


standard:每次都会新建,每个Task都可以有,且每个Task都可以有多个实例(每个Task都可以有,且可以有多个)


singleTop:当前实例如果在栈顶,就不新建实例,调用其OnNewIntent。 如不在栈顶,则新建实例 (每个Task都可以有,且可以有多个,在栈顶时可复用)

以上两种模式比较简单。


假设两个应用A和B(A的主activity为m1,singleTop为m2,singleTask为m3,singleInstance为m4,;B的主activity为n1)返回键会使应用退出task

singleTask:新建一个Task,如果已经有其他的Task并且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)

1)该实例只会存在A应用Task中,如果A应用没有创建,那么会创建一个新的task,此时按home键退出,并且A自己启动的时候发现A的主页面并没有启动而是直接打开该task的m3页面。

2)A应用已经启动且m3存在实例,并且m3上面还有其它的activity,那么如果从本应用或者其它应用再次打开m3时,m3上面的activity都会销毁。


onNewIntent()非常好用,Activity第一启动的时候执行onCreate()---->onStart()---->onResume()等后续生命周期函数,也就时说第一次启动Activity并不会执行到onNewIntent(). 而后面如果再有想启动Activity的时候,那就是执行onNewIntent()---->onResart()------>onStart()----->onResume().  如果android系统由于内存不足把已存在Activity释放掉了,那么再次调用的时候会重新启动Activity即执行onCreate()---->onStart()---->onResume()等。


singleInstance:新建一个Task,且在该Task中只有它的唯一一个实例。 (只有一个Task会有,且该Task中只有它)

1)m4不会存在与其主应用A中,也不会存在于打开它的应用B中,m4单独存在于一个task中。

2)B应用打开后,打开m4,如果m4不存在,那么会新建一个task,此时如果按home键,启动A应用会启动A自身的task。

3)如果想启动m4,可以在task列表中发现,会有三个task存在,且m4单独存在一个task中。


总结:

1)每一个应用都有一个以其主Activity为root的task堆栈。

2)SingleInstance会单独的拥有一个task,不依赖于任何应用的task。(如果A、B应用均已启动,m4也启动,那么系统现在会有三个task,可以查看task列表)

3)SingleTask依赖于自己应用的Task,只会存在于自身的应用当中。(且如果A应用之前没有启动过,那么如果此task没有退出,启动A应用时,m3会作为应用task的root存在,这意味着A的主activity得不到执行)

4)singleTask会结束自己上面的activity。

5)B启动singleTask,会将A应用task移到B的上面来,变为可见task。

6)启动standared和singleTop模式的activity,都只会在自身的task中创建该实例。

7)这次测试发现,系统每次新建一个task都会在之前的基础上加一。(taskid会越来越大)


应用场景暂时略掉


下面用图解释上面的总结:

activity lunchmode详解_第1张图片

启动模式应用场景这篇文章写得不错,内容正确性可以保证:文章

singleTop适合接收通知启动的内容显示页面。
例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。
singleTask适合作为程序入口点。
例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
singleInstance适合需要与程序分离开的页面。
例如闹铃提醒,将闹铃提醒与闹铃设置分离。
singleInstance不要用于中间页面,如果用于中间页面, 跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。





你可能感兴趣的:(android,Activity,launchMode)