Activity的四种启动模式和应用场景

Activity的“singleTask“属性及其应用 清除任务栈:由于singleTask属性的特性,当启动一个singleTask的Activity时,系统会将该Activity上方的所有Activity实例全部出栈。这在某些情况下非常有用,比如在应用的设置页面中,当用户修改了设置项后,可以通过启动一个设置确认界面的singleTask Activity来清除其他页面,确保用户返回到设置页面时看到的是最新的设置。当一个Activity被设置为singleTask时,系统在启动该Activity时会首先检查任务栈中是否已存在该Activity的实例。 阅读详情

Activity的四种启动模式和应用场景

简介

通过设置ActivityManifestActivity_launchMode可以设置Activity的启动模式。

默认情况下,使用启动模式:standard。

同时,launchMode可以通过Intent flags的改变在运行时被复写,比
如 Intent flags FLAG_ACTIVITY_SINGLE_TOP, FLAG_ACTIVITY_NEW_TASK,
FLAG_ACTIVITY_MULTIPLE_TASK.

四种模式

Constant

Value

Description

standard

0

默认模式,会在启动时创建一个新实例,创建的模式也可以随Intent.FLAG_ACTIVITY_NEW_TASK而改变

singleTop

1

当启动activity时,有相同的activity在前台与用户交互,那就复用这个activity,这个实例会被调用Activity.onNewIntent()。

singleTask

2

在启动activity时,若有一个运行着这个activity的task,那这个activity实例会被调到前台,并调用Activity.onNewIntent() ,启动实例的Intent的flag会被设置Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT . singleTask是singleTop的一个扩展集。This is a superset of the singleTop mode, where if there is already an instance of the activity being started at the top of the stack, it will receive the Intent as described there (without the FLAG_ACTIVITY_BROUGHT_TO_FRONT flag set). See the Tasks and Back Stack document for more details about tasks.

singleInstance

3

开辟一个只允许一个activity实例在里头运行的task. 如果用同样的intent再次启动这个activity,task会被调到前台,其Activity.onNewIntent() 会被调用. 如果这个activity实例要启动一个新activity,那么这个新activity会在一个新task中运行.

Demo范例调试

目录结构:MainActivity、Activity1\Activity2、Activity3

唯一的一个layout

<RelativeLayout

    ......

    tools:context="com.example.testlaunchermode.MainActivity" >

 

    <TextView

        android:id="@+id/txt_this"

        ... />

    <Button

        android:id="@+id/btn_activity_1"

        ....

        android:text="btn_activity1" />

    <Button

        android:id="@+id/btn_activity_2"

        ...

        android:text="btn_activity2" />

    <Button

        android:id="@+id/btn_activity_3"

        ...

        android:text="btn_activity3" />

</RelativeLayout>

几个除了红色字体外,其余全部一模一样的Activity

public class Activity2 extends ActionBarActivity {

Button mBtnAct1, mBtnAct2, mBtnAct3;

TextView mTxtThis;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mTxtThis = (TextView) findViewById(R.id.txt_this);

        mTxtThis.setText(Activity2.this.toString());

       android.util.Log.e("TestLauncherMode", Activity2.this + " onCreate");

        mBtnAct1 = (Button) findViewById(R.id.btn_activity_1);

        mBtnAct1.setOnClickListener(new View.OnClickListener() {

                @Override

                public void onClick(View v) {

                        android.util.Log.e("TestLauncherMode", Activity2.this + " navigate to Activity1");

                        startActivity(new Intent(getBaseContext(), Activity1.class));

                }

        });

        mBtnAct2 = (Button) findViewById(R.id.btn_activity_2);

        mBtnAct2.setOnClickListener(new View.OnClickListener() {

                @Override

                public void onClick(View v) {

                        android.util.Log.e("TestLauncherMode", Activity2.this + " navigate to Activity2");

                        startActivity(new Intent(getBaseContext(), Activity2.class));

                }

        });

        mBtnAct3 = (Button) findViewById(R.id.btn_activity_3);

        mBtnAct3.setOnClickListener(new View.OnClickListener() {

                @Override

                public void onClick(View v) {

                        android.util.Log.e("TestLauncherMode", Activity2.this + " navigate to Activity3");

                        startActivity(new Intent(getBaseContext(), Activity3.class));

                }

        });

    }

    public void onStop(){

     super.onStop();

     android.util.Log.e("TestLauncherMode", Activity2.this + " onStop");

    }

}

红色字体,相应替换就OK了。

 

AndroidManifest.xml

  ......

        <activity

            android:name=".MainActivity"

            android:label="@string/app_name" >

            <intent-filter>

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

 

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

        <activity android:name="Activity1" />

        <activity android:name="Activity2" />

        <activity android:name="Activity3" />

  ......

前提注释:从Launcher启动的Activity,肯定是NEW_TASK。这点可以查看Launcher的源码。

模式1:standard。默认模式。
操作如下:MainActivity->Activity1->Activity1->Activity1->Back->Back->Back->Back

 

仔细看一下這个log转换成图形

这是默认的启动模式,每次启动,都启动一个new Instance。

模式2:singleTop

这个范例把Activity1的launchMode=”singleTop”

操作如下:
MainActivity->Activity1->Activity1->Activity1->Activity1->Activity1->Activity2->Activity3->Activity1->Activity1->Back->Back->Back->Back

 

仔细看navigate的字段,这些是点击跳转时打印的动作信息。

转换成图形

 

可以看出,当task顶部有singleTop的Activity时,就复用;若没有就重新创建。

singleTop:就是栈顶只有一个instance。

适合  接受推送消息的展示页

某些本应只展示一个的场景,比如一下子收到一堆推送消息,不能每个都弹出来吧。但凡是这样的都行。优酷的推荐视频,电商app推送一个活动。

模式3:singleTask---Activity2设置成singleTask

 

转换成图形

 

为什么会这样呢。因为Activity2是singleTask,如果task里没有就new,若有,就把Activity2之上的全部移除掉。这样,自己就变成了顶。所以说,singleTask是singleTop的扩展。

singleTop:顶上不是target Activity,new一个

singleTask:顶上不是target Activity,移除target之上的,把自己变成top。

singleTask的特性是头上不允许有任何task。也不会有重复的instance。在target Activity之后的任何activity都会被干掉。等于重生啊。

适合程序入口,不需要启动后activity的

是的,只能用在启动页了吧,首页,这种只允许有一个instance,如果有其他就移除掉它顶上的。从这个Activity进入的其他activity都抛弃掉了。用户要再操作一次。

官网的文档说----make sure to test the usability of the activity during launch

确实,得好好考虑下,不是所有activity都可以用的

模式4:singleInstance-activity2设置成singleInstance


转换成图形

 

这图有点复杂。两个框代表两个task,这应没什么问题。下框没连接部分,都跑到Activity2去了。

可以看到一启动到Activity2就会重新开辟一个task。而这里头的task只有一个activity2.

在返回的时候,是一个task,一个task的返回的。

要从当前的task开始,上图task2结束后就跳转到task1了。

singleInstance的特性是  完全同程序分离。完全独立运行的。

同样的也要想清楚再用。

适合需要与程序分离开的页面。

这种页面包括,闹钟的提示框。有兴趣的朋友可以看下package/app下的源码,grep一把,就会发现是这样的


框内是内部apk的独特应用。也用的singleInstance。就不混淆视听了。

 

小结

使用方式:

standard:怎么样都要创建

singleTop:顶上不是target Activity,new一个

singleTask:顶上不是target Activity,移除target之上的,把自己变成top。

singleInstance:开辟私有的task,完全独立于程序的其他activity的task。

使用场景:

standard:普通activity

singleTop:要展示推送过来的消息

singleTask:程序入口等启动页面

singleInstance:完全独立的,类似闹钟的提示


Activity的singleTask加载模式详解及编程示例 当我们多次点击该按钮时,会发现每次启动SingleTaskActivity时,都会创建一个新的任务栈,并将SingleTaskActivity放入栈顶。singleTask是Activity的一种加载模式,它的特点是每次启动该Activity时都会创建一个新的任务栈,并且在该任务栈中只存在一个该Activity实例。例如,当我们有一个主屏幕Activity,并且希望其他部分功能的Activity在独立的任务栈中打开,这时可以使用singleTask加载模式。二、singleTask加载模式的特点。 阅读详情

相关推荐

OpenCompass实战:从零部署大模型评测平台,量化模型能力选型

在大模型技术选型与评估中,客观、可量化的评测体系是工程实践的关键。其核心原理在于通过标准化的数据集、统一的评测方法与自动化流程,将主观的模型体验转化为可比较的指标数据。这种评测框架的技术价值在于解决了模型能力评估的模糊性问题,为开发者提供了模型选型、效果对比与迭代优化的科学依据。典型的应用场景包括对比不同开源模型在代码生成、逻辑推理等特定任务上的性能,或是评估微调后模型在业务数据集上的提升效果。OpenCompass作为开源的大模型全能力评测平台,正是这一理念的工程化实现。它通过模块化的四层流水线架构和配置

weixin_28725037的博客 626

Activity的四种启动模式

系统默认的启动模式,栈结构,先进后出,打开一个activity入栈,再打开下个activity,接着入栈,我们平时直接创建的Activity都是这种模式的Activity这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;如果要激活的那个Activity在任务栈

Ai1114的博客 4万+

线性代数——(期末突击)行列式(上)-行列式计算、行列式的性质

简单解释一下:4213原本的顺序应为1234,对于‘4’而言,‘2’、‘1’、‘3’都应该排在它的前面,所以此处记逆序数为3;对于‘2’而言,‘1’应该排在它的前面,而‘3’排在它之后 是合理的,所以此处只有一个逆序数;最后看‘1’,其后面的‘3’排在后面显然也是合理的,故而4213的逆序数为4.一般我们使用这个性质来计算四阶行列式,也就是将其变换成三角行列式,再计算对角线的值;以主对角线为分界线的就为正三角,反之则为反三角行列式。若行列式某一行(列)为0,则该行列式=0.将和的那一行分开,其余行。

li13437542099的博客 1万+

Activity四种启动模式详解

Activity的四种启动模式详解

m0_56740643的博客 4546

STM32F103多通道PWM输出避坑指南:TIM1_CH1异常输出的解决方案

本文深入解析STM32F103多通道PWM输出中的TIM1_CH1异常问题,提供从时钟配置到GPIO复用的系统化解决方案。通过黄金法则配置流程和高级调试技巧,帮助开发者快速定位并解决PWM输出不稳定、占空比异常等问题,同时拓展多定时器协同和互补PWM等高级应用场景。

weixin_29194817的博客 117

详解Σ-Δ型ADC拓扑结构的基本原理

现在,总环路滤波器的H(f)具有更大的滚降,Mod 2型的噪声传递函数具有40 dB/十倍频程的上升速率。同样,当正弦波输入为负满量程时,+1和–1之间的转换会减少,输出以–1为主。噪声传递函数是一个高通滤波器函数,提供噪声整形,在DC附近的较低频率,对量化噪声有很强的抑制。H(f)是环路滤波器的函数,定义噪声和信号的传递函数。Σ-Δ型ADC的噪底由热噪声决定,而不受量化噪声的限制。量化噪声为量化器的输入与输出之差。图5. Mod 1 Σ-Δ环路的线性模型(b),包括方程、滤波器、信号和噪声传递函数图。

qq_43416206的博客 1810

【Android Activity】Activity的启动模式

安卓是采用任务栈来管理activity的,默认情况下多次启动同一个activity系统会重复创建这个activity的实例,并把每个实例依次入栈。为了避免activity实例的重复创建、应付特殊的场景、安卓为activity设计了启动模式。

dev晴天的博客 6895

STM32 USB AUDIO实战指南——从零构建音频设备

本文详细介绍了如何使用STM32F407构建USB音频设备,从硬件准备到软件配置,再到音频播放和录制功能的实现。通过STM32CubeMX配置和实战代码示例,帮助开发者快速掌握USB Audio Class规范,实现低延迟、高质量的音频传输,适用于语音交互、音乐播放等多种场景。

weixin_42549037的博客 484

安卓基础 - Activity的四种启动模式和应用场景

简介 通过设置ActivityManifestActivity_launchMode可以设置Activity的启动模式。 默认情况下,使用启动模式:standard。 同时,launchMode可以通过Intent flags的改变在运行时被复写,比 如IntentflagsFLAG_ACTIVITY_SINGLE_TOP,FLAG_ACTIVITY_NEW_TASK, FL...

LLL_foever的博客 344

ROS中costmap_converter插件的配置与使用

在学习TEB算法的过程中,作者提供了一个插件用于转换代价地图,原始的代价地图是由栅格地图中单元格组成,用于表示障碍物,但单元格占用的计算资源较大,故采用插件将单元格转换成点,线,多边形表示。 插件激活 rospack plugins --attrib=plugin costmap_converter 配置cfg文件 在导航配置文件下,新建costmap_converter_params.yaml #######################################################

weixin_42621524的博客 5904

SecureCRT串口连接保姆级教程:从驱动安装到波特率设置(附常见问题解决)

本文提供SecureCRT串口连接的保姆级教程,涵盖从USB转串口驱动安装、端口识别到波特率等核心参数设置的完整流程。针对连接失败、乱码、键盘输入无响应等高频问题,给出了深度排查与解决方案,帮助网络与嵌入式开发新手快速掌握串口调试技能。

weixin_29281941的博客 433

activity的四种启动模式和应用场景(补2019071903)

参考:https://blog.youkuaiyun.com/wangxueming/article/details/73294777 使用方式,使用场景 standard:普通创建 ----------- 普通activity singleTop:顶上不是target Activity,new 一个 ----------需要展示推送过来的消息 singletop:顶上不是targetAc...

qq_32290639的博客 207

全桥 LLC 谐振变换器详细解析:结构 + 控制 + 工作原理全搞懂!

在现代高效率电源系统中,LLC 谐振变换器🔥早已成为降损利器。尤其是全桥 LLC 拓扑结构,由于其在、副边整流管的 ZCS(零电流关断),再加上优秀的效率表现,已经成为服务器电源、电动汽车 OBC、光伏逆变等场景的首选。那么,全桥 LLC 到底长啥样?它的控制方式是怎么回事?具体工作波形又是如何呢?今天我们就来一篇讲清楚、讲透彻的文章!🚗💨。

weixin_43199439的博客 3517

Activity的四种启动模式及其应用场景

任务栈:(1)程序打开时就会创建一个任务栈,用于存储当前程序的activity,所有的activity属于一个任务栈;(2)一个任务栈包含了一个activity集合,去有序的选择哪个activity和用户进行交互;只有在任务栈顶的activity才可以跟用户进行交互;(3)任务栈可以移动到后台,并且保留每一个activity状态,并且有序的给用户列出他们的任务,而且还不丢失他们的状态信息;(4)退...

qing_happy88的博客 273

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Activity的四种启动模式深入解析

Activity的四种启动模式深入解析

似霰的博客 4576

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

android activity四种启动模式介绍以及应用场景

    Android activity的启动模式一共有四种,分必是standard,singleTop,singleTask,singleInstance。启动模式的设置在AndroidManifest.xml文件中&lt;activity android:name=".MainActivity" android:launchMode="singleTask"&gt;。standard模式:标准...

JiangCaiCao的博客 397

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Activity的四种启动模式的介绍及其应用场景

应用场景: 1.singleTop适合接收通知启动的内容显示页面。例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。聊天的对话窗口, 2.singleTask适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。之前打开过的页面,打

JustinNick的博客 4903

android的四种启动模式,Activity的四种启动模式详解

Activity的启动模式1. 启动模式的类别标准模式(standard)栈顶复用模式(singleTop)栈内复用模式(singleTask)单例模式(singleInstance)2. 任务栈任务栈Task,是一种用来放置Activity实例的容器,他是以栈的形式进行盛放,也就是所谓的先进后出,主要有2个基本操作:压栈和出栈,其所存放的Activity是不支持重新排序的,只能根据压栈和出栈操作...

weixin_42502957的博客 413

Android开发——Activity启动模式详解

1. Activity的启动模式 1.1 Standard标准模式 系统默认的启动模式,即便实例存在,每次启动都会创建一个新的实例,每个实例可以属于不同的任务栈。 若ActivityA以此模式启动了Activity B,那么B会进入A所在的栈。注意,若是非Activity类型的Context,如ApplicationContext,并没有任务栈,因此以ApplicationConte...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 1万+

Android中Activity的四种启动模式

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。Android总Activity的启动模式分为四种: 在AndroidManifest.xml中设置Activity启动模式: Activity的四种启动模式:

JJMM2009的专栏 4546

Activity启动模式(基于应用场景分析)

可以根据实际的需求为Activity设置对应的启动模式,从而刻意避免创建大量重复的Activity等问题Activity有四种加载模式: Standard(默认) SingleTop SingleTask SingleInstance 设置的位置AndroidMainfest.xml文件中的activity元素的android:launchMode属性:<activity android:name

LXChild的专栏 773
上一篇: 车抵借款协议书
下一篇: Activity生命周期
手艺人王学明
手艺人王学明 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄17年 441粉丝 185原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值