Android LaunchMode启动模式

参考https://www.cnblogs.com/naray/p/6992515.html
https://blog.csdn.net/sinat_14849739/article/details/78072401

一、Standard:标准模式

也是系统默认的启动模式。
每次启动都会创建一个新的Activity实例,不管这个实例在栈中是否已经存在。
Activity所在的任务栈为启动新Activity B的Activity A所在任务栈。
具体就是Activity A所在的任务栈为S1,Activity A启动Activity B,那么Activty B的实例被创建后,
会将Activity B的实例压入任务栈S1中。
  • 总结:
    启动一次Activity,系统就会在当前任务栈新建一个实例
  • 场景:
    正常的去打开一个新的页面,这种启动模式使用最多,最普通 。

二、SingleTop:栈顶复用模式

在这种启动模式下
如果新Activity已经在任务栈的栈顶,那么,将不会重新创建新Activity,同时onNewIntent(...)方法被回调,通过此方法参数可以获取到请求信息。
需要注意的是此Activity的onCreate(...)和onStart(...)方法也不会被调用。
比如:有四个Activity,分别为ABCD,Activity D的LaunchMode是SingleTop模式;
如果,在任务栈中四个Activity的排列是ABCD的顺序,此时,启动Activity D,由于Activity D位于任务栈栈顶,那么就不会创建Activity D实例,系统会调用Activity D的onNewIntent(...)方法。此时,Activity在任务栈中的顺序依然是ABCD。
如果,在任务栈中四个Activity的排列是ADBC的顺序,此时,启动Activity D,由于Activity D没有位于任务栈栈顶,那么,就会创建Activity D的新实例,并压下任务栈中。此时,Activity在任务栈中的顺序是ADBCD。
  • 总结:
    1、当前栈中已有该Activity的实例并且该实例位于栈顶时,不会创建实例,而是复用栈顶的实例,并且会将Intent对象传入,回调onNewInten()方法;
    2、当前栈中已有该Activity的实例但是该实例不在栈顶时,其行为和standard启动模式一样,依然会创建一个新的实例;
    3、当前栈中不存在该Activity的实例时,其行为同standard启动模式。
  • 场景:
    这种模式应用场景的话,假如一个新闻客户端,在通知栏收到了3条推送,点击每一条推送会打开新闻的详情页,如果为默认的启动模式的话,点击一次打开一个页面,会打开三个详情页,这肯定是不合理的。如果启动模式设置为singleTop,当点击第一条推送后,新闻详情页已经处于栈顶,当我们第二条和第三条推送的时候,只需要通过Intent传入相应的内容即可,并不会重新打开新的页面,这样就可以避免重复打开页面了。

三、SingleTask:栈内复用模式

这是一种单实例模式,在这种模式下,
只要Activity在一个任务栈中存在,那么多次启动此Activity都不会创建新的实例,和SingleTop一样,系统会调用其onNewIntent(...)方法。
具体一点就是,有一个Activity A,并启动Activity A。
首先寻找Activity A所需的任务栈,如果任务栈不存在,则创建任务栈并将Activity A压入栈中。
如果Activity A所需的任务栈已经存在,则看Activity A在任务栈中,是否存在实例,
如果不存在实例,就会创建新的实例并压入栈中;
如果Activity A实例在已经存在的任务栈中,则将Activity A的实例调到栈顶,由于SingleTask有clearTop效果,在Activity A实例之上的所有Activity都会被出栈,直至Activity A到栈顶为止。
比如:有	四个Activity,分别为ABCD,并且Activity B的launchMode为SingleTask,此时启动Activity B。
如果,Activity B所需的任务栈不存在,此时会创建其任务栈S1并将Activity B压入栈中。
如果,Activity B所需的任务栈S1已经存在,此时会在任务栈S1中查看Activity B的实例是否在栈中存在。假如,Activity B的实例在任务栈S1中存在,并且当前任务栈中已经存在几个Activity,在任务栈中的排列为ABCD,那么,此时启动Activity B,不会再创建Activity B的实例,系统会调用其Activity B的onNewIntent(...)方法。并且将Activity B调至栈顶,由于SingleTask有clearTop效果,CD两个Activity会被出栈,直至Activity B被调到栈顶。
如果,Activity B所需的任务栈S1已经存在,此时会在任务栈S1中查看是否存在Activity B的实例,如果不存在,则在任务栈S1中创建Activity B的实例,并压入任务栈S1中。
  • 总结:
    在复用的时候,首先会根据taskAffinity去找对应的任务栈:
    1、如果不存在指定的任务栈,系统会新建对应的任务栈,并新建Activity实例压入栈中。
    2、如果存在指定的任务栈,则会查找该任务栈中是否存在该Activity实例
    a、如果不存在该实例,则会在该任务栈中新建Activity实例。
    b、如果存在该实例,则会直接引用,并且回调该实例的onNewIntent()方法。并且任务栈中该实例之上的Activity会被全部销毁。
  • 场景:
    SingleTask这种启动模式最常使用的就是一个APP的首页,因为一般为一个APP的第一个页面,且长时间保留在栈中,所以最适合设置singleTask启动模式来复用。

四、SingleInstance:单实例模式

这是一种加强版的SingleTask模式
它除了具有SingleTask的所有特性外,还加强了一点,就是具有此模式的Activity只能单独位于一个任务栈中。
换句话说就是,一个Activity B是SingleInstance模式,在启动Activity B时,会创建Activity B所需的任务栈S2,并将Activity B压入栈中,并且这个任务栈S2,只会有一个Activity,那就是Activity B。
由于栈内复用模式,再次启动Activity B时,均不会再创建Activity B的实例,系统会调用Activity B的onNewIntent(...)方法。除非,Activity B所需的任务栈S2被系统销毁,否则不会再创建Activity B的实例。
  • 总结:
    启动该模式Activity的时候,会查找系统中是否存在:
    1、不存在,首先会新建一个任务栈,其次创建该Activity实例。
    2、存在,则会直接引用该实例,并且回调onNewIntent()方法。

  • 场景:
    很常见的是,电话拨号盘页面,通过自己的应用或者其他应用打开拨打电话页面 ,只要系统的栈中存在该实例,那么就会直接调用。

PS:Android App在创建任务栈时,默认使用的是包名为任务栈名称,当前也可以自定义指定任务栈名称,比如:

<activity
            android:name=".SecondActivity"
            android:launchMode="singleInstance"
            android:taskAffinity="com.example.task.task.SecondActivity11"
            android:allowTaskReparenting="true"/>

其中,属性taskAffinity与allowTaskReparenting是配合使用的,taskAffinity指定任务栈名称。属性taskAffinity只有在SingleTask和SingleInstance模式下有效。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值