从生命周期和应用场景简述activity四种mode区别和用途

时间:2021-02-28 14:44:57

standard就是只要有intent调用activty,task中就会生成新的activty实例,生命周期自然每次都是从onCreate开始了,然后该activity显示在最前端.


singleTop如果intent调用的activity不在task,也就是从没创建或者创建的已经onDestroy,activity进入onCreate,创建新实例;

如果intent调用的activity在task中但不在task顶端,activity进入onCreate,创建新实例;

如果intent调用的activity在task顶端,acitivity进入onPause,再进入onNewIntent。


singleTask,如果intent调用的activity不在task中,也就是从没创建或者创建的已经onDestroy,activity进入onCreate,创建新实例;

如果intent调用的actvity在task顶端,也就是当前actvity就是intent调用的activity时,actvity会先进入onPause,然后进入onNewIntent。

如果intent调用的activity不在task顶端,也就是该activity曾经被创建过,并且没调用onDestroy,只是被新打开的actvity遮住了,这时遮住该activity的其他activity都会调用onDestroy,该acitivity进入onNewIntent并显示在最前端。


singleInstance这个比较复杂,牵涉到task的具体意义,我用图来方便理解吧。

创建多个activity,其实可以当作系统将新的acitivity压入栈,最新创建的就在栈顶,所以也就显示在用户界面最上层。

t提示:->结尾代表正在显示的组件,下面的M代替app的主界面,并且除了activity A外的activity都默认为standard mode

M创建singleInstance的acitivty A时;

id为3的task:M

id为4的task:A->

看到没,A的创建不是压入了M的task栈,而是新建的task栈。这时在A中创建新的acitivty B时

id为3的task:M->B->

id为4的task:A

看到没,这时会回到M所在的task栈中把activity B压入栈。

也就是说singleInstance mode,保证了满足两个条件:1.无论多少次intent调用该activity只有一个实例(英文instance)       2.并且只有该activity的实例,不会存在其他acitivty(所以系统为该acitivity分配新的task)。

接下来继续说明

这时我们在activity B中,调用finish,会发生什么呢

id为3的task:M->

id为4的task:A

会回到M,因为activity B 在id为3的task中,所以finish后会显示id为3的task中下一个activity


讲完了生命周期,相信大家在用这些mode的时候就不会错误猜想了activtity当前生命周期了,例如把所有初始化放在了onCreate,但是可能系统调用的是onNewIntent


singleInstance 是为了保证整个android只有一个实例,这样资源消耗巨大并且频繁使用的acitivity能在其他程序*用,减少从新创建而浪费资源。

像是商城类的app可能会用到singleTop,这样如果用户在商品详情页看到了另一个感兴趣的商品(通常一个商品的详情里面会有推荐其他商品),直接点击进入它的详情页时(是同一个acitivty显示的),就不会重新创建activtity,如果不用singleTop就会创建新的,那么用户要返回时就要按很多次返回= =,显然从用户体验,和程序优化角度来讲都是不合理的。

像是果壳app,因为他们文章之间会有关联性,如果一个文章引用了另一个文章,那么用户点进去引用的那篇文章时,显然是希望创建新的activity,看完相关内容后,再返回原来的文章,这是就要用standard。


留有疑问:当我切换到其他app,然后切换回来,再finish activity M时,不会回到acitivty A,但是如果不切换到其他app,直接finish M,就会回到activity A