当前位置:   article > 正文

Activity启动模式(Standard,SingleTop,SingleTask,SingleInsance)_系统的锁屏采用的是单任务 模式,flag_activity_single_top作用是为activi

系统的锁屏采用的是单任务 模式,flag_activity_single_top作用是为activity指定

Activity的启动模式对于初学者来说,平时不常会去考虑这方面的知识,但是久而久之会在代码中碰到一些需要按多次back键才会回到我们的主界面,所以借此问题就总结了一些这方面的知识点(以前也是懵懂懵懂的)。

Activity的四种启动模式:
Standard:默认的启动模式(不断的创建Activity)
SingleTop:需要创建的Activity已经处于任务栈顶时,复用此Activity
SingleTask:需要创建的Activity已经处于任务栈中时,弹出它之上的其它Activity,让其处于栈顶
SingleInstance:全局单例模式,只要整个系统中创建过此Activity的实例,不再创建。

(1) Standard:
说明: Android创建Activity时的默认模式,如果没有为Activity设置启动模式的话,默认为标准模式。
每次启动一个Activity都会重新创建一个新的实例入栈,不管这个实例是否存在。
生命周期: 每次被创建的实例Activity 的生命周期符合典型情况,它的onCreate、onStart、onResume都会被调用。
https://img-blog.csdn.net/20170303203558620?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSVRlcm1lbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
运行模式: A-B-C-C

(2)SingleTop:栈顶复用模式
说明: 分两种处理情况:需要创建的Activity已经处于栈顶时,此时会直接复用栈顶的Activity,不会再创建新的Activity;
若需要创建的Activity不处于栈顶,此时会重新创建一个新的Activity入栈,同Standard模式一样。
生命周期: 若情况一中栈顶的Activity被直接复用时,它的onCreate、onStart不会被系统调用,因为它并没有发生改变,
但是一个新的方法 onNewIntent会被回调(Activity被正常创建时不会回调此方法)。
https://img-blog.csdn.net/20170303204628314?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSVRlcm1lbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
运行模式: A-B-C(当C处于栈顶时,再次调用不会创建C,而是调用一个新方法onNewIntent)
A-B-C-D-C(当C不是处于栈顶时,则与Standard一样)。

(3)SingleTask:栈内复用模式
说明: 若需要创建的Activity已经处于栈中时,此时不会创建新的Activity,而是将存在栈中的Activity上面的其它Activity全部销毁,使它成为栈顶。
生命周期: 同SingleTop位于栈顶时的生命周期一样,只会重新回调Activity中的onNewIntent方法。
https://img-blog.csdn.net/20170303205023925?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSVRlcm1lbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
运行模式: A-B-C-D —>再次启动B时 —>A-B (弹出(销毁)B以上的Activity)

(4)SingleInstance:单实例模式
说明: SingleInstance比较特殊,是全局单例模式,是一种加强的SingleTask模式,它除了具有它所有特性外,还加强了一点:具有此模式的Activity只能单独位于一个任务栈中。
这个常用于系统中的应用,例如Launch、锁屏键的应用等等,整个系统中只有一个!所以在我们的应用中一般不会用到,了解即可。

启动模式的使用方式

1,在Mainfest.xml中指定Activity启动模式(android:launchMode=”“):

2,启动Activity时,在Intent中指定启动模式去创建Activity
Intent intent = new Intent();
intent.setClass(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

注意:以上两种方式都可以为Activity指定启动模式,但是二者还是有区别的。
(1)优先级:动态指定方式即第二种比第一种优先级要高,若两者同时存在,以第二种方式为准。 
(2)限定范围:第一种方式无法为Activity直接指定 FLAG_ACTIVITY_CLEAR_TOP 标识,第二种方式无法为Activity指定 singleInstance 模式。
  • 1
  • 2
  • 3

Activity 的 Flags(动态注册时会使用到)

  1. FLAG_ACTIVITY_NEW_TASK:
    作用是为Activity指定 “SingleTask”启动模式,跟在AndroidMainfest.xml指定效果相同。

  2. FLAG_ACTIVITY_SINGLE_TOP
    作用是为Activity指定 “SingleTop”启动模式,跟在AndroidMainfest.xml指定效果相同。

  3. FLAG_ACTIVITY_CLEAN_TOP(类似SingleTask静态启动模式)
    具有此标记位的Activity,启动时会将与该Activity在同一任务栈的其它Activity出栈,一般与SingleTask启动模式一起出现。
    它会完成SingleTask的作用,但其实SingleTask启动模式默认具有此标记位的作用

    4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS(不会在栈中出现)
    具有此标记位的Activity不会出现在历史Activity的列表中,使用场景:当某些情况下我们不希望用户通过历史列表回到Activity时,
    此标记位便体现了它的效果。它等同于在xml中指定Activity的属性:
    android:excludeFromRecents=”true”

启动模式的实际应用场景

这四种模式中的Standard模式是最普通的一种,没有什么特别注意,而SingleInstance模式是整个系统的单例模式,在我们的应用中一般不会应用到,
所以,这里就具体讲解 SingleTop 和 SingleTask模式的运用场景:

    1. SingleTask模式的运用场景
    最常见的应用场景就是保持我们应用开启后只有一个Activity的实例,最典型的例子就是应用中展示的主页(Home页)。假设用户在主页跳转到其它页面,
    执行多次操作后想返回到主页,如果不使用SingleTask模式,在点击返回的过程中会多次看到主页,这明显就是设计不合理了。

    2. SingleTop模式的运用场景
    如果你在当前的Activity中又要启动同类型的Activity,此时建议将此类型Activity的启动模式指定为SingleTop,可以减少Activity的创建,节省内存!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
注意:复用Activity时的生命周期回调
  • 1

这里还需要考虑一个Activity跳转时携带页面参数的问题。

    因为当一个Activity设置了SingleTop或者SingleTask模式后,跳转此Activity出现复用原有Activity的情况时,此Activity的onCreate方法将不会再次执行!
    onCreate方法只会在第一次创建Activity时被执行。

    而一般onCreate方法中会进行该页面的数据初始化、UI初始化,如果页面的展示数据无关页面跳转传递的参数,则不必担心此问题,若页面展示的数据就是通过getInten() 
    方法来获取,那么问题就会出现:getInten()获取的一直都是老数据,根本无法接收跳转时传送的新数据!

    正如我们上面有所提到的一个叫做onNewIntent(Intent intent)的方法,此方法会传入最新的intent,这样我们就解决了无法获取到最新的数据的问题了。因为不管
    是SingerTop模式还是SingerTask模式在重新加载Activity的时候都会调用onNewIntent(Intent intent)方法;
        eg:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
    /*
    * 复用Activity时的生命周期回调
    */
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        initData();
        initView();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码架构师/article/detail/60699
推荐阅读
相关标签
  

闽ICP备14008679号