美文网首页
理解Android Activity四种启动方式standard

理解Android Activity四种启动方式standard

作者: 安安爸Chris | 来源:发表于2017-12-10 22:44 被阅读0次

    参考: https://inthecheesefactory.com/blog/understand-android-activity-launchmode/en

    Android在内存管理上良好的设计架构,使Acitivity成为Android上最常用的概念,它的出现完美的解决了移动操作系统上的多任务处理。

    然而,Activity不仅仅是指显示在屏幕上的界面,启动也值得一看。下面我们就来看一下LaunchMode。

    使用LaunchMode

    使用很简单,不再赘述,如下

    <activity
        android:name=".SingleTaskActivity"
        android:label="singleTask launchMode"
        android:launchMode="singleTask">
    

    只要在AndroidManifest.xml中申明Activity中添加launchMode即可。
    一共有四中type,我们一个一个来看。

    1. standard

    这是默认选择,如果不显示设置,则默认为这个。

    这个模式下的Activity每次都是创建一个新的实例用来处理每一个发来的intent。想象一下,如果有十个发给处理邮件的Activity,那么会创建十份实例来单独处理每一个发来的intent。

    在Lollipop之前版本的行为

    在同一个Task(任务栈)上,每次创建的实例都放到Task的top位置。


    同一个页面被多次调用

    如果从其他应用跳转,那么该实例在其他应用所在的task上。比如说这里从Gallery跳转到我们的Activity,那么Activity实例刚在Gallery所在task的top位置,如下图


    其他应用跳转
    但是这里有点奇怪,在任务管理器中可以看到,Gallery的task上显示的不是Gallery相关的页面;而且如果想回到Gallery的Activity页面的话,还得从我们的这个Activity中返回才可以。
    其他应用的task上显示的Activity实例

    Lollipop版本的行为

    在同一个app中,行为跟pre-Lolipop一致。


    同一个app内

    但在不同app跳转时,会新建一个task。


    不同app中 任务管理器中显示多个task

    这是因为Lolipop版本中修改了Task Management system。这种实现使你在发生跳转后,可以通过切换task返回到原来的应用,而不是非要把当前的activity弹出task任务栈。

    2. singleTop

    singleTop跟standard模式基本相同。唯一的不同是如果调用者task中已经存在了相同的activity实例并且该实例在task顶部,那么就不会再创建新实例,而是调用该实例的onNewIntent()方法

    onNewIntent方法
    所以在singleTop模式下,在处理intent的时候,同时需要在onCreate和onNewIntent两个地方考虑好。

    singleTop最常见的一个应用场景是搜索页面searchActivity。在搜索某一项结束后,如果再发起搜索,那么应该是原来已经存在的searchActivity再继续处理,而比重新创建一个实例来处理要好。

    3. singleTask

    该模式跟前面两种显著不同。就如同单例模式一样,该模式只允许该Acitivity实例只有一份。如果该Activity实例已经存在,当intent来的时候,该Activity实例所在的task会调用到top位置,并且触发该Activity实例的onNewIntent方法。
    在同一个app内
    如果之前没有创建过实例,那么新建一个实例。

    singleTask模式下新建实例

    但是如果已经创建过实例,那么实例所在的task中该实例上面的所有其他Activity实例都会被销毁(调用生命周期方法);同时我们的activity实例被调用onNewIntent方法。

    task中覆盖的其他activity实例都会被销毁

    Google文档中描述到

    The system creates a new task and instantiates the activity at the root of the new task.

    但是实际上的行文跟文档上有一些不一样。(可以通过dumpsys activity命令查看)
    SingleTask模式的Activity仍然占在一个存在task上,而不是重新创建一个新的task。

    如果想和Google文档中描述的一致,可以使用taskAffinity属性。

    <activity
        android:name=".SingleTaskActivity"
        android:label="singleTask launchMode"
        android:launchMode="singleTask"
        android:taskAffinity="">
    

    效果如下图


    配置taskAffinity

    4. SingleInstance

    和singleTask很像。如果singleInstance的实例调用其他activity,那么该acitivity新创建一个task;如果该singleInstance模式的activity被创建,同样的会新创建一个task。

    相关文章

      网友评论

          本文标题:理解Android Activity四种启动方式standard

          本文链接:https://www.haomeiwen.com/subject/itjvixtx.html