[Android]启动模式之singleInstance

      被大佬问了一个问题,四种启动模式,然后ActivityA是singleInstance,然后B和C未指定启动模式,启动顺序是A -> B -> C -> A,这个时候栈的变化是怎样的?当然我是回答错误了,然后在这里做个总结。

      首先回顾一下基础概念:Android的四种启动模式:standrad、singleTop、singleTask、singleInstance。strandrad就是系统默认的启动方式,也就是每次startActivity的时候就会创建一个新的Activity实例放在task栈上;singleTop是栈顶复用,也就是在startActivity之后会先判断,当栈顶有这个Activity的时候那么就不会创建新的Activity,而是复用栈顶的Activity,否则新建Activity实例并加入栈顶;singleTask是栈内复用,也就是在startActivity之后会先判断,当栈内有这个Activity的时候那么就会把这个Activity上面的Activity全部出栈,然后该Activity出现在栈顶,否则新建Activity实例并加入栈顶;singleInstance会单独给这个Activity一个task栈并且该task栈里只有该Activity实例。

      然后回归到问题本身上来:
      第一步是A -> B,当singleInstance的Activity去启动其它三种启动的Activity的时候栈是什么样的变化情况。第一点,因为A是singleInstance,那么A是自己单独的一个任务栈,而且这个栈中只有唯一的该实例,所以A启动B,无论B是什么启动模式都会会启动一个新的栈。
      第二步是B -> C,当B的启动模式是singleInstance的时候,同第一步。当B是其它三种的情况的时候就需要看C的启动模式,当C是singleInstance的时候C也会启动一个单独的task栈;当C是standrad和singleTop的时候会跟B在同一个栈中;当C是singTask的时候就很有意思了,它可能跟B在同一个栈中,也可能不在同一个栈在中。是否在同一个栈中就涉及到了taskAffinity这个属性,简单说来就是taskAffinity属性相同那么就在同一个栈中,如果不同就在不同的栈中。
      然后是C -> A,因为A已经启动过了,那么就不会新建一个task栈,而是复用这个栈。

      看似问题已经回答完了,其实还有一点点细节需要说一下,当A -> B的时候因为A是singleInstance,那么它其实是会设定B的启动标志为FLAG_ACTIVITY_NEW_TASK,这个地方很有意思,FLAG_ACTIVITY_NEW_TASK的含义是将Activity放入一个新启动的Task,那么当Task存在的时候实际上就不会有新的操作在里面,所以说会有一个很有意思的现象,A -> B -> C -> A -> B(A是singleInstance,B和C非singleInstance),第一次A -> B是正常启动,第二次的时候实际上是直接跳转到了C!关于taskAffinity需要注意两个点,一是这个属性只有配合singleTask才会起作用,如果单一设定这个属性的话是不会生效的;二是当多个应用可以通过这个属性共享同一个task栈。

      最后说一下singleInstance的使用场景,我在平常其实这种启动方法并不常用,网上的例子里唯一说到真正的使用场景的就是拨号界面。所以我理解下来就是它的使用场景是当需要多个应用公用同一个界面的时候才会去使用这种启动模式。

发布了61 篇原创文章 · 获赞 2 · 访问量 8713

猜你喜欢

转载自blog.csdn.net/woaily1346/article/details/97260281
今日推荐