精华内容
下载资源
问答
  • 2019-06-19 21:37:00
    1. 默认启动模式standard
      不会检测ACTIVITY 是否重复。 在该模式下,启动的Activity会依照启动顺序被依次压入Task中。
    2. 栈顶复用模式singleTop
      在该模式下,如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity。
    3. 栈内复用模式singleTask
      与singleTop模式相似,只不过singleTop模式是只是针对栈顶的元素,而singleTask模式下,如果task栈内存在目标Activity实例,则:
      将task内的对应Activity实例之上的所有Activity弹出栈。
      将对应Activity置于栈顶,获得焦点。
    4. 全局唯一模式singleInstance
      在该模式下,我们会为目标Activity分配一个新的affinity,并创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task有且只有这一个Activity实例。
      如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒(对应Task设为Foreground状态)

    作者:Zy_JiBai
    来源:CSDN
    原文:https://blog.csdn.net/zy_jibai/article/details/80587083
    版权声明:本文为博主原创文章,转载请附上博文链接!

    更多相关内容
  • Activity四种启动模式

    千次阅读 2022-02-19 18:08:07
    standard :默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中 singleTop:如果在任务的栈顶正好存在该Activity的实例,就重用该实例(会调用实例的onNewintent()), 否则就会创建新的实例并放入...

    standard :默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中

    singleTop:如果在任务的栈顶正好存在该Activity的实例,就重用该实例(会调用实例的onNewintent()),
    否则就会创建新的实例并放入栈顶(注:即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建实例)

    singleTask: 如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewintent()),重用时,会让该实例回到栈顶,
    因此在它上面的实例将会被移出栈,如果栈中不存在该实例,将会创建新的实例放入栈中

    singleTask:在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity的实例已经存在于某个栈中,任何应用在激活该Activity时都会重用该栈中的实例(会调用实例的onNewintent()),其效果相当于多个应用共享一个应用,不管谁激活该Activity都会进入同一个应用中。



    AndroidManifest.xml文件配置

     <!-- standard 默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中-->
            </activity>
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <!-- 配置SingleTopActivity -->
            <activity
                android:name=".SingleTopActivity"
                android:label="SingleTop模式"
                android:launchMode="singleTop">
            </activity>
    
            <!-- 配置singleTaskActivity -->
            <activity
                android:name=".singleTaskActivity"
                android:label="singleTask"
                android:launchMode="singleTask">
            </activity>
    



    在Java文件的使用

    //standard 默认模式
    this.findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //激活启动标准模式
                    startActivity(new Intent(MainActivity.this,MainActivity.class));
                }
            });
    
    
    //        <!-- 激活启动SingleTopActivity -->  singleTop模式
            this.findViewById(R.id.bt1).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    startActivity(new Intent(MainActivity.this,SingleTopActivity.class));
                }
            });
    
    
    //         <!-- 激活启动singleTaskActivity -->  singleTask模式
            this.findViewById(R.id.opensingleTask).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    startActivity(new Intent(MainActivity.this,singleTaskActivity.class));
                }
            });
    
    
    		 <!-- 激活启动singleinstance -->
            this.findViewById(R.id.openSingleinstance).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //打开其他应用
                    Intent intent=new Intent();
                    intent.setClassName("com.example.mysingleinstance1","com.example.mysingleinstance1.MainActivity");
    //                激活启动
                    startActivity(intent);
                }
            });
    



    在另一个安卓应用中的AndroidManifest.xml**文件配置

     <activity
                android:name=".MainActivity"
                android:exported="true"
                android:launchMode="singleInstance">
    <!--            设置singleInstance-->
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
    展开全文
  • Activity 四种启动模式详细介绍 ...Activity启动模式设置: <activity android:name=.MainActivity android:launchMode=standard> <activity android:name=.MainActivity android:launchMode
  • activity四种启动模式

    2016-08-31 15:25:57
    activity四种启动模式
  • 在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity启动模式决定了Activity的启动运行方式。 本文档讲解Android中Activity启动模式
  • Android Activity四种启动模式及其应用场景 https://blog.csdn.net/qq_31939617/article/details/80696728
  • Activity四种启动模式及应用场景

    千次阅读 2019-03-29 10:47:18
    面试的时候科大讯飞的一个面试官问我...一、Activity四种启动模式: (一)、基本描述 standard:标准模式:如果在mainfest中不设置就默认standard;standard就是新建一个Activity就在栈中新建一个activity实例; si...

     

    面试的时候科大讯飞的一个面试官问我Activity的启动模式和具体的应用模式;我也一想是啊,平时不太注意,只知道有这几个启动模式,结果到了关键的时刻卡壳了,做个记录:

    一、Activity四种启动模式:
    (一)、基本描述
    standard:标准模式:如果在mainfest中不设置就默认standard;standard就是新建一个Activity就在栈中新建一个activity实例;
    singleTop:栈顶复用模式:与standard相比栈顶复用可以有效减少activity重复创建对资源的消耗,但是这要根据具体情况而定,不能一概而论;
    singleTask:栈内单例模式,栈内只有一个activity实例,栈内已存activity实例,在其他activity中start这个activity,Android直接把这个实例上面其他activity实例踢出栈GC掉;
    singleInstance :堆内单例:整个手机操作系统里面只有一个实例存在就是内存单例;

    在singleTop、singleTask、singleInstance 中如果在应用内存在Activity实例,并且再次发生startActivity(Intent intent)回到Activity后,由于并不是重新创建Activity而是复用栈中的实例,因此Activity再获取焦点后并没调用onCreate、onStart,而是直接调用了onNewIntent(Intent intent)函数;

    二、Activity四种启动模式常见使用场景:
    这也是面试中最为长见的面试题;当然也是个人工作经验和借鉴网友博文,如有错误纰漏尽请诸位批评指正;

    LauchMode       Instance
    standard             邮件、mainfest中没有配置就默认标准模式
    singleTop           登录页面、WXPayEntryActivity、WXEntryActivity 、推送通知栏
    singleTask         程序模块逻辑入口:主页面(Fragment的containerActivity)、WebView页面、扫一扫页面、电商中:购物界面,确认订单界面,付款界面
    singleInstance    系统Launcher、锁屏键、来电显示等系统应用

    二.启动模式的使用方式

    1. 在 Manifest.xml中指定Activity启动模式

    一种静态的指定方法,在Manifest.xml文件里声明Activity的同一时候指定它的启动模式,这样在代码中跳转时会依照指定的模式来创建Activity。样例例如以下:

     

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

    2. 启动Activity时。在Intent中指定启动模式去创建Activity

    一种动态的启动模式,在new 一个Intent后,通过Intent的addFlags方法去动态指定一个启动模式。例如以下:

            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 模式。

     

    三. Activity 的 Flags

    标记位既能够设定Activity的启动模式,如同上面介绍的,在动态指定启动模式,比方 FLAG_ACTIVITY_NEW_TASK 和FLAG_ACTIVITY_SINGLE_TOP 等。它还能够影响Activity 的运行状态 ,比方 FLAG_ACTIVITY_CLEAN_TOP 和 FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 等。

    以下介绍几个基本的标记位,切勿死记,理解几个就可以,须要时再查官方文档。

    1. FLAG_ACTIVITY_NEW_TASK

    作用是为Activity指定 “SingleTask”启动模式。跟在AndroidMainfest.xml指定效果同样。

    2. FLAG_ACTIVITY_SINGLE_TOP

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

    3. FLAG_ACTIVITY_CLEAN_TOP

    具有此标记位的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模式,在点击返回的过程中会多次看到主页,这明显就是设计不合理了。

    1. SingleTask模式的运用场景
    最常见的应用场景就是保持我们应用开启后仅仅有一个Activity的实例。最典型的样例就是应用中展示的主页(Home页)。

    假设用户在主页跳转到其他页面,运行多次操作后想返回到主页,假设不使用SingleTask模式,在点击返回的过程中会多次看到主页,这明显就是设计不合理了。

    2. SingleTop模式的运用场景
    假设你在当前的Activity中又要启动同类型的Activity,此时建议将此类型Activity的启动模式指定为SingleTop,能够降低Activity的创建,节省内存!

    /*
    * 复用Activity时的生命周期回调
    */
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            setIntent(intent);
            initData();
            initView();
        }

    当前singleTop模式的Activity正处于栈顶时,跳转该Activity会调用onNewintent方法且不会重新创建该Activity实例,只会重新调用该实例,生命周期为:onPause->onNewIntent->onResume 

    展开全文
  • 当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中。Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=""设置
  • Activity四种启动模式: 1. standard,默认的启动模式,只要激活Activity,就会创建一个新的实例,并放入任务栈中,这样任务栈中可能同时有一个Activity的多个实例。 2. singleTop,激活Activity时,如果栈顶是...
  • 细谈Activity四种启动模式

    万次阅读 多人点赞 2018-06-06 17:04:32
    ),今天我们谈一谈我们在Android开发中必不可缺少的一个组件——Activity: Activity作为四大组件之一,也可以说是四大组件中最重要的一个组件,它负责App的视图,还负责用户交互,而且有时候还经常其他组件绑定...

        嗨大家好,又和大家见面了,上一次我们一起搞清楚了Handler的源码机制(现在回想起来是不是感觉也就那么回事,当时看的头皮发麻-。+!!),今天我们谈一谈我们在Android开发中必不可缺少的一个组件——Activity:

        Activity作为四大组件之一,也可以说是四大组件中最重要的一个组件,它负责App的视图,还负责用户交互,而且有时候还经常其他组件绑定使用,可以说非常的重要。

        虽然说我们天天都在使用Activity,但是你真的对Activity的生命机制烂熟于心,完全了解了吗?的确,Activity的生命周期方法只有七个(自己数-。+),但是其实那只是最平常的情况,或者说是默认的情况。也就是说在其他情况下,Activity的生命周期可能不会是按照我们以前所知道的流程,这就要说到我们今天的重点了——Activity的启动模式:我们的Activity会根据自身不同的启动模式,自身的生命周期方法会进行不同的调用。

    一、在将启动模式之前必须了解的一些知识:

        在正式的介绍Activity的启动模式之前,我们首先要了解一些旁边的知识,这些知识如果说模糊不清,那么在讨论启动模式的时候会一头雾水(笔者亲身感悟)。

    1.一个应用程序通常会有多个Activity,这些Activity都有一个对应的action(如MainActivity的action),我们可以通过action来启动对应Activity(隐式启动)。

    <action android:name="android.intent.action.MAIN" />

    2.一个应用程序可以说由一系列组件组成,这些组件以进程为载体,相互协作实现App功能。

    3.任务栈(Task Stack)或者叫退回栈(Back Stack)介绍:

    3.1.任务栈用来存放用户开启的Activity。

    3.2.在应用程序创建之初,系统会默认分配给其一个任务栈(默认一个),并存储根Activity。

    3.3.同一个Task Stack,只要不在栈顶,就是onStop状态:


    3.4.任务栈的id自增长型,是Integer类型。

    3.5.新创建Activity会被压入栈顶。点击back会将栈顶Activity弹出,并产生新的栈顶元素作为显示界面(onResume状态)。

    3.6.当Task最后一个Activity被销毁时,对应的应用程序被关闭,清除Task栈,但是还会保留应用程序进程(狂点Back退出到Home界面后点击Menu会发现还有这个App的框框。个人理解应该是这个意思),再次点击进入应用会创建新的Task栈。

    4.Activity的affinity:

    4.1.affinity是Activity内的一个属性(在ManiFest中对应属性为taskAffinity)。默认情况下,拥有相同affinity的Activity属于同一个Task中。

    4.2.Task也有affinity属性,它的affinity属性由根Activity(创建Task时第一个被压入栈的Activity)决定。

    4.3.在默认情况下(我们什么都不设置),所有的Activity的affinity都从Application继承。也就是说Application同样有taskAffinity属性。

    <application
            android:taskAffinity="gf.zy"

    4.4.Application默认的affinity属性为Manifest的包名。


    暂时就是这么多了,如果还有不妥的地方我会补充的。接下来我们来正式看Activity的启动模式:

    二、Activity启动模式:

    1.默认启动模式standard:

        该模式可以被设定,不在manifest设定时候,Activity的默认模式就是standard。在该模式下,启动的Activity会依照启动顺序被依次压入Task中:


    上面这张图讲的已经很清楚了,我想应该不用做什么实验来论证了吧,这个是最简单的一个,我们过。

    2.栈顶复用模式singleTop:

        在该模式下,如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity。



    这次我来用代码举例:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="zy.pers.activitytext">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:taskAffinity="gf.zy"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".TwoActivity"
                android:launchMode="singleTop">
                <intent-filter>
                    <action android:name="ONETEXT_TWOACTIVITY" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>
            <activity android:name=".ThreeActivity">
                <intent-filter>
                    <action android:name="ONETEXT_THREEACTIVITY" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>

    这是我的第一个应用OneText的Mainfest结构,里面创建了三个Activity,我们把第二个Activity的模式设置为singleTop。

    每个Activity界面都只有一个显示当前界面名称的TextView和一个用来组跳转的Button,所以应用OneText的功能就是从活动1跳转到活动2,活动2继续跳转活动2,代码就不给大家展示了,都能写出来。


    我们发现在我们跳转到TwoActivity之后,点击跳转新的TwoActivity时候,他没有响应。

    为了作对比,我们再把TwoActivity设置为standard,看一看效果:


    我们发现创建了很多的TwoActivity。

    同时我们打印上task的Id(我没有把所有周期方法都打印log):


    发现他们全部都是来自一个Task。这个可以过。

    应用场景:

    开启渠道多,适合多应用开启调用的Activity:通过这种设置可以避免已经创建过的Activity被重复创建(多数通过动态设置使用,关于动态设置下面会详细介绍)

    3.栈内复用模式singleTask:

        与singleTop模式相似,只不过singleTop模式是只是针对栈顶的元素,而singleTask模式下,如果task栈内存在目标Activity实例,则:

    1. 将task内的对应Activity实例之上的所有Activity弹出栈。
    2. 将对应Activity置于栈顶,获得焦点。

    同样我们也用代码来实现一下这个过程:

    还是刚才的那一坨代码,只是我们修改一下Activity1的模式为singleTask,然后让Activity2跳转到Activity3,让Activity3跳转到Activity1:


    在跳回MainActivity之后点击back键发现直接退出引用了,这说明此时的MainActivity为task内的最后一个Activity。所以这个模式过。

    应用场景:

    程序主界面,我们肯定不希望主界面被多创建,而且在主界面退出的时候退出整个App是最好的设想。

    耗费系统资源的Activity:对于那些及其耗费系统资源的Activity,我们可以考虑将其设为singleTask模式,减少资源耗费(在创建阶段耗费资源的情况,个人理解-。+)。

    4.全局唯一模式singleInstance:

        这是我们最后的一种启动模式,也是我们最恶心的一种模式:在该模式下,我们会为目标Activity分配一个新的affinity,并创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task有且只有这一个Activity实例。       如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒(对应Task设为Foreground状态)


    我们为了看的更明确,这次不按照上图的步骤设计程序了(没错,这几张图都不是我画的-。+!)。

    我们先指定一下这次的程序:还是这三个Activity,这次Activity3设置为singleInstance,1和2默认(standard)。

    然后我们看一下这个效果:


    说一下我们做了什么操作:

    首先由1创建2,2创建3,然后又由3创建2,2创建3,3创建2,然后一直back,图如下:


    还请各位别嫌弃我-。+,图虽然不好看,但是很生动形象。。。。具体说一下:这张图对应着我们上面的程序流程,黄色的代表Background的Task,蓝色的代表Foreground的Task。

    我们发现back的时候会先把Foreground的Task中的Activity弹出,直到Task销毁,然后才将Background的Task唤到前台,所以最后将Activity3销毁之后,会直接退出应用。

    但是有没有想过这样会出现一个问题,什么问题我们直接看图就好:


    我简单说一下这个案例:1,2,3三个Activity,2是singleInstance模式,然后1->2,2->3,之后狂点back,在回到Home界面后点击菜单键,发现首先启动的是2Activity。

    简单解释一下:1和3是一个task,2是单独的一个task,在我们2->3后,前台的task又从2的回到了1和3的。所以最后退出的task是2的线程,而如果不是重新启动App。上一次最后关闭的Task是2的,所以。。

    所以说singleInstance设置的Activity最好不要设置成中间界面。


    以上表示我们关于四种模式的最基本理解,其实有了前面的知识了解之后,我们发现这些其实也不是很难对吧。。。真正比较绕的在后面-。+,注意前方高能:

    三、动态设置启动模式

        在上述所有情况,都是我们在Manifest中设置的(通过launchMode属性设置),这个被称为静态设置(我们写程序写多了会发现有静态就有动态,而且静态多数在xml设置,动态在java代码设置-。+),接下来我们来看一下如何动态的设置Activity启动方式。

    注):如果同时有动态和静态设置,那么动态的优先级更高。

    1.关于动态设置与静态设置的理解:

        关于这个理解我是看过一篇文章,比较认同里面的思想,所以在这里也总结一下:

        静态设置,可以理解为通知别人:就是当我被创建的时候,我告诉你我是通过这种模式启动的。

        动态设置,可以理解为别人的要求:别人给我设一个Flag,我就以这种Flag的方式启动。

        可能这个没什么用哈,但是仔细想一下这种对程序的思想理解应该是正确的。

    2.几种常见的Flag:

        我们说的动态设置,其实是通过Intent。对与Intent这个类大家应该不陌生吧,我们刚才在启动Activity的时候就用到这个类了。

    如果我们要设置要启动的Activity的启动模式的话,只需要这样:

    intent.setFlags(、、、、、);

    然后在里面添加对应的Flag就好,那么接下来我们介绍几个常见的Flag(他的Flag太多了,头皮发麻。):

    2.1._NEW_TASK

    他对应的Flag如下:

    Intent.FLAG_ACTIVITY_NEW_TASK

    这个Flag跟我们的singleInstance很相似:在给目标Activity设立此Flag后,会根据目标Activity的affinity进行匹配:如果已经存在与其affinity相同的task,则将目标Activity压入此Task。    反之没有的话,则新建一个task,新建的task的affinity值与目标Activity相同。然后将目标Activity压入此栈。

    其实简单来说,就是先看看需不需要创建一个新的Task,根据就是有没有相同的affinity。然后把Activity放进去。

    但是此情况和singleInstance有不同,有两点注意的地方:

    1. 新的Task没有说只能存放一个目标Activity。只是说决定是否新建一个Task。而singleInstance模式下新的Task只能放置一个目标Activity。
    2. 在同一应用下,如果Activity都是默认的affinity,那么此Flag无效。而singleInstance默认情况也会创建新的Task。

    这个东西理解起来可能有一些抽象,我们通过一个实例来证明他:

    在之前的一些例子中,我们都是在同一应用之间进行跳转,而现在我们进行不同App的Activity相互跳转(其实就是创造一个不同taskAffinity的情况。。。忘了的话见一、4)。

    首先,我们需要创建一个新的App——TwoApp,这个App目前只需要一个MainActivity就够了,我们在MainActivity放置一个button,让他跳转到OneApp的TwoActivity。

    public void onClick(View v) {
        Intent intent = new Intent("ONETEXT_TWOACTIVITY");
        
        startActivity(intent);
    }

    这是跳转的代码。

    现在我们先概述一下我们的流程:我们先打开TwoApp,然后在TwoApp的MainActivity界面跳转到OneApp的TwoActivity。

    对于OneApp的设定,我们已经将三个Activity都设置成了standard模式。还是1->2,2->3,3->2。

    代码就不上了,这么简单,大家自己也能写出来。效果如下:

    为了看的清清楚楚,最开始清空了所有的进程。

    现在我们点开TwoApp,

    现在只有TwoApp一个进程,

    现在我们点开了 OneApp的TwoActivity,但是我们发现他还是只有一个进程,


    现在我们在TwoApp的MainActivity跳转到OneApp的TwoActivity,添加_NEW_TASK的Flag。

    public void onClick(View v) {
        Intent intent = new Intent("ONETEXT_TWOACTIVITY");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }

    我们再看一下效果,还是跟刚才一样先清空所有的进程,这次效果直接连起来看了:


    与上面不同的地方在于,我们新的界面创建在了新的进程中——其实就是OneApp被唤醒了,我们来分析一下为什么会这样:

    首先我们会想一下我们上面所学过的一个东西,affinity:我们说这个东西在默认情况下就是App的包名packageName,而OneApp中的TwoActivity默认的affinity就是OneApp的包名。这里能够理解吧。

    然后我们说_NEW_TASK情况下,会先查找是否有对应的affinity的task,如果有就不在创建,直接将其放入,反之新建task,所以新建的task就是我们的OneApp的task,我们可以再做一个测试,我们先唤醒OneApp,然后再让TwoApp跳转到OneApp的TwoActivity(有点绕啊。。。),我们看是什么情况:

    首先启动OneApp,并跳转到ThreeActivity。

    然后启动TwoApp,并跳转到OneApp的TwoActivity。

    然后一直点击Back,

    我们发现在Two中唤醒One的TwoActivity,同样是被放入了OneApp的默认Task中。

    关于_NEW_TASK我们就说这么多吧。

    2.2._SINGLE_TOP

    该模式比较简单,对应Flag如下:

    Intent.FLAG_ACTIVITY_SINGLE_TOP

    次Flag与静态设置中的singleTop效果相同,所以请见二、2.

    2.3._CLEAR_TOP

    这个模式对应的Flag如下:

    Intent.FLAG_ACTIVITY_CLEAR_TOP

    当设置此Flag时,目标Activity会检查Task中是否存在此实例,如果没有则添加压入栈,

    如果有,就将位于Task中的对应Activity其上的所有Activity弹出栈,此时有以下两种情况:

    • 如果同时设置Flag_ACTIVITY_SINGLE_TOP,则直接使用栈内的对应Activity,
    • 没有设置。。。。。。。,则将栈内的对应Activity销毁重新创建。

    关于这个Flag,我们发现他和singleTask很像,准确的说,是在_CLEAR_TOP和_SINGLE_TOP同时设置的情况下,就是singleTask模式。

    而唯一不同的一点就在于:他会销毁已存在的目标实例,再重新创建。这个我们通过打印一下生命周期就好。

    这次我们只用OneApp就好了,还是1->2,2->3,3->2,这次我们将2的Flag设置为_CLEAR_TOP,看一下TwoActivity的生命周期。


    我们的流程如下:1->2       2->3    3->2     2->3    3->2    back    back   然后就退出了,这说明在Task内2上面的3的确被弹出栈了。

    然后我们再看一下2的日志:


    我想在日志图片上面标注的很清楚了,我只截取了一部分日志,我们质疑3->2时候先销毁,后创建。


    好,现在我们同时加上_SINGLE_TOP的Flag。

    效果相同,我们只看log:


    很明显,在3->2的时候,TwoActivity调用了onRestart方法,也就是栈顶复用了。

    这个Flag过。


    其实还有一点点东西想提一下的,但是感觉 篇幅已经很恶心了。。。。再写下去可能更没人看了吧/笑着哭,所以决定找机会穿插到下一篇文章中:Activity标签中task相关属性

    喜欢的话可以关注一波,有建议和不同观点的欢迎下方留言!感谢大家的支持!

    展开全文
  • 1、Standard:是活动默认的启动模式,在不进行显式指定的情况下,所有活动都会自动使用这种启动模式。Android中是使用返回栈来管理活动的,在standard模式下每当启动一个新的活动
  • 管理方式 Activity的管理方式 =任务栈 任务栈 采用的结构 = “后进先出” 的栈结构 每按一次Back键,就有一个Activity出栈 区别: ...有四种模式 standard 默认启动模式,每次启动Activi...
  • 参考:... activity 启动的四种模式 : AndroidManifest.xml :: android:launchMode="???" 1.standard:【不会检测ACTIVITY 是否重复】  Activity的默认启动模式,在这种模式下启动的acti...
  • 关于Activity四种启动模式demon 博文地址:http://blog.csdn.net/sapce_fish/article/details/52672495
  • Android的Activity一共有4中启动模式分别是:standard、singleTop、singleTask、singleInstance。资源是该例子的项目,直接导入项目即可。
  • Activity四种启动模式的特点

    千次阅读 2017-03-31 18:38:27
    一.Activity四种启动模式的特点 1.standard模式  Activity默认的启动模式,依次入栈出栈,满足"先进后出"的原则。这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加 2.singleTop模式  ...
  • Activity四种启动模式的区别

    千次阅读 2016-10-11 09:53:48
    Activity四种启动模式的区别
  • Activity四种启动模式

    千次阅读 2021-11-11 15:51:20
    顾名思义就是activity启动时的执行策略,一共有四种,分别是standard、singleTop、singleTask、singleInstance。 启动模式的设置在AndroidManifest.xml中修改,默认是standard模式,如果需要修改的话要在<...
  • Android中Activity四种启动模式和taskAffinity属性详解

    万次阅读 多人点赞 2013-09-06 23:40:07
    在android应用开发中,打造良好的用户体验是非常重要的。...activity启动模式会影响Task和Back Stack的状态,进而影响用户体验。除了启动模式之外,Intent类中定义的一些标志(以FLAG_ACTIVITY_开头)也会影响Task和
  • Activity四种启动模式说明

    千次阅读 2016-03-21 15:54:46
    1,standard标准模式: 每次启动一个Activity都会重新...被启动Activity会自动添加到启动它的Activity的任务栈中,因此用ApplicationContext启动standard模式Activity时会报错(Context没有所谓的任务栈) 2,singleTo
  • 这是有关Activity四种启动模式的示例代码,来源于网络并加上了一些个人的注释和总结。
  • Android编程中经常涉及到页面的切换,启动一个新的页面(或者说Activity)的时候需要为其指定合适的“启动模式”。指定的启动模式不合适,会出现类似下面这种奇怪的效果: 你拿起QQ切换了一个新的账号,一直按返回...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 97,766
精华内容 39,106
关键字:

activity的四种启动模式