为了账号安全,请及时绑定邮箱和手机立即绑定

Android中Activity的启动模式(LaunchMode)和使用场景

标签:
Android

记录下今天碰到的知识点,Android中的android:launchMode属性是android中的启动动模式;取值可为:

standard(标准)

    这种启动模式为标准模式,也是默认模式。每当我们启动一个Activity,系统就会相应的创建一个实例,不管这个实例是否已经存在。这种模式,一个栈中可以有多个实例,每个实例也都有自己的任务栈。而且是谁启动了此Activity,那么这个Activity就运行在启动它的Activity所在的栈中。

Manifest中配置:

    对于标准模式,android:launchMode=”standard”可以不写,因为默认就是standard模式。

    <activity     android:name=".StandardActivity"     android:launchMode="standard" ></activity>

使用场景:

    标准模式下,只要启动一次Activity,系统就会在当前任务栈新建一个实例;一般用在正常的去打开一个新的页面,这种启动模式使用最多,最普遍。



singleTop(栈顶复用)

    这种启动模式下,如果要启动的Activity已经处于栈的顶部,那么此时系统不会创建新的实例,而是直接打开此页面,同时它的onNewIntent()方法会被执行,我们可以通过Intent进行传值,而且它的onCreate(),onStart()方法不会被调用,因为它并没有发生任何变化。

Manifest中配置:

    <activity       android:name=".SingleTopActivity"       android:launchMode="singleTop"></activity>

使用场景:

    当前栈中已有该Activity的实例并且该实例位于栈顶时,不会创建实例,而是复用栈顶的实例,并且会将Intent对象传入,回调onNewInten()方法;

    当前栈中已有该Activity的实例,但是该实例不在栈顶时,其行为和standard标准模式一样,依然会创建一个新的实例;

    当前栈中不存在该Activity的实例时,创建一个新的实例。    

    这种模式应用场景的话,假如一个新闻客户端,在通知栏收到了3条推送,点击每一条推送会打开新闻的详情页,如果为默认的启动模式的话,点击一次打开一个页面,会打开三个详情页,这肯定是不合理的。如果启动模式设置为singleTop,当点击第一条推送后,新闻详情页已经处于栈顶,当我们第二条和第三条推送的时候,只需要通过Intent传入相应的内容即可,并不会重新打开新的页面,这样就可以避免重复打开页面了。



singleTask(栈内复用)

    在这个模式下,如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,因为singleTask本身自带clearTop这种功能。并且会回调该实例的onNewIntent()方法。其实这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。不设置taskAffinity属性的话,默认为应用的包名。

Manifest配置:

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

    设置taskAffinity属性,singleTask所在的Activity与启动它的Activity处于不同的任务栈中

    <activity

         android:name=".SingleTaskActivity"

         android:launchMode="singleTask"

         android:taskAffinity="${applicationId}.singleTask">

    </activity>

    指定了taskAffinity后,我们发现除了taskId有区别外,其他调用基本没有什么区别。因为MainActivity没有指定taskAffinity属性,默认为包名,与SingleTaskActivity不同,所以在启动SingleTaskActivity时,发现这个栈不存在,系统首先会创建这个栈然后将SingleTaskActivity压入栈中。之后我们发现只要栈中存在SingleTaskActivity这个实例,就会直接引用

使用场景:

    如果不存在指定的任务栈,系统会新建对应的任务栈,并新建Activity实例压入栈中;

    如果存在指定的任务栈,则会查找该任务栈中是否存在该Activity实例

        如果不存在该实例,则会在该任务栈中新建Activity实例。

        如果存在该实例,则会直接引用,并且回调该实例的onNewIntent()方法。并且任务栈中该实例之上的Activity会被全部销毁,

     SingleTask这种启动模式最常使用的就是一个APP的首页,因为一般为一个APP的第一个页面,且长时间保留在栈中,所以最适合设置singleTask启动模式来复用



singleInstance(单实例)

    单实例模式,顾名思义,只有一个实例。该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。

Manifest配置:

<activity    android:name=".SingleInstanceActivity"    android:launchMode="singleInstance"></activity>

使用场景:

    启动单例模式Activity的时候,会查找系统中是否存在:

        不存在,首先会新建一个任务栈,其次创建该Activity实例;

        存在,则会直接引用该实例,并且回调onNewIntent()方法。

        特殊情况,该任务栈或该实例被销毁,系统会重新创建

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



点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消