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