Android启动模式详解

Android启动模式详解

  • standard
    默认模式。在该模式下,Activity可以拥有多个实例,并且这些实例既可以位于同一个task,也可以位于不同的task。每次都会新创建。
  • singleTop
    该模式下,在同一个task中,如果存在该Activity的实例,并且该Activity实例位于栈顶则不会创建该Activity的示例,而仅仅只是调用ActivityonNewIntent()。否则的话,则新建该Activity的实例,并将其置于栈顶。
  • singleTask
    顾名思义,只容许有一个包含该Activity实例的task存在!
    android浏览器browser中,BrowserActivitylauncherMode="singleTask",因为browser不断地启动自己,所以要求这个栈中保持只能有一个自己的实例,browser上网的时候,
    遇到播放视频的链接,就会通过隐式intent方式跳转找Gallery3D中的MovieView这个类来播放视频,这时候如果你点击home键,再点击browser,你会发现MovieView这个类已经销毁不存在了,
    而不会像保存这个MovieView的类对象,给客户带来的用户体验特别的不好。就像别人总结的singleTask模式的Activity不管是位于栈顶还是栈底,再次运行这个Activity时,都会destory掉它上面的Activity来保证整个栈中只有一个自己。
    下面是官方文档中的介绍:
    The system creates a new task and instantiates the activity at the root of the new task. However, if an instance of the activity already exists in a separate task, the system routes the intent to the existing
    instance through a call to its onNewIntent() method, rather than creating a new instance. Only one instance of the activity can exist at a time.

    singleTask方式启动的Activity,全局只有唯一个实例存在,因此,当我们第一次启动这个Activity时,系统便会创建一个新的任务栈,并且初始化一个Activity实例,放在新任务栈的底部,如果下次再启动这个Activity时,
    系统发现已经存在这样的Activity实例,就会调用这个Activity实例的onNewIntent方法,从而把它激活起来。从这句话就可以推断出,以singleTask方式启动的Activity总是属于一个任务栈的根Activity
    下面我们看一下示例图: 
    image
    坑爹啊!有木有!前面刚说singleTask会在新的任务中运行,并且位于任务堆栈的底部,这里在Task B中,一个赤裸裸的带着singleTask标签的箭头无情地指向Task B堆栈顶端的Activity Y,什么鬼?
    这其实是和taskAffinity有关,在将要启动时,系统会根据要启动的ActivitytaskAffinity属性值在系统中查找这样的一个TaskTaskaffinity属性值与即将要启动的ActivitytaskAffinity属性值一致。如果存在,
    就返回这个Task堆栈顶端的Activity回去,不重新创建任务栈了,再去启动另外一个singletaskactivity时就会在跟它有相同taskAffinity的任务中启动,并且位于这个任务的堆栈顶端,于是,前面那个图中,
    就会出现一个带着singleTask标签的箭头指向一个任务堆栈顶端的Activity Y了。在上面的AndroidManifest.xml文件中,没有配置MainActivitySubActivitytaskAffinity属性,
    于是它们的taskAffinity属性值就默认为父标签applicationtaskAffinity属性值,这里,标签applicationtaskAffinity也没有配置,于是它们就默认为包名。
    总的来说:singleTask的结论与android:taskAffinity相关:  
    • 设置了singleTask启动模式的Activity,它在启动的时候,会先在系统中查找属性值affinity等于它的属性值taskAffinity的任务栈的存在;如果存在这样的任务栈,它就会在这个任务栈中启动,否则就会在新任务栈中启动。
      因此,如果我们想要设置了singleTask启动模式的Activity在新的任务栈中启动,就要为它设置一个独立的taskAffinity属性值。以A启动B来说当ABtaskAffinity相同时:第一次创建B的实例时,并不会启动新的task
      而是直接将B添加到A所在的task;否则,将B所在task中位于B之上的全部Activity都删除,然后跳转到B中。
    • 如果设置了singleTask启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的Activity实例,如果存在,就会把位于这个Activity实例上面的Activity全部结束掉,
      即最终这个Activity实例会位于任务的堆栈顶端中。以A启动B来说,当ABtaskAffinity不同时:第一次创建B的实例时,会启动新的task,然后将B添加到新建的task中;否则,将B所在task中位于B之上的全部Activity都删除,然后跳转到B中。
  • singleInstance
    顾名思义,是单一实例的意思,即任意时刻只允许存在唯一的Activity实例,而且该Activity所在的task不能容纳除该Activity之外的其他Activity实例!
    它与singleTask有相同之处,也有不同之处。
    相同之处:任意时刻,最多只允许存在一个实例。
    不同之处:
    • singleTaskandroid:taskAffinity属性的影响,而singleInstance不受android:taskAffinity的影响。
    • singleTask所在的task中能有其它的Activity,而singleInstancetask中不能有其他Activity
    • 当跳转到singleTask类型的Activity,并且该Activity实例已经存在时,会删除该Activity所在task中位于该Activity之上的全部Activity实例;而跳转到singleInstance类型的Activity,并且该Activity已经存在时,
      不需要删除其他Activity,因为它所在的task只有该Activity唯一一个Activity实例。

更多文章请查看AndroidNote

你的star是我的动力!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值