Android Activity启动模式(android:launchMode="")

Android - 全面解析Activity启动模式(LaunchMode) 欢迎Follow我的GitHub, 关注我的优快云. 在Android应用中, Activity是最核心的组件, 如何生成一个Activity实例, 可以选择不同的启动模式, 即LaunchMode. 启动模式主要包括: standard, singleTop, singleTask, singleInstance. 标准模式在每次启动时, 都会创建实例; 三种单例模式, 会根据情况选择创建还是复 阅读详情

Android Activity启动模式(android:launchMode="")
0

作者:樱蝴蝶更新于 04月28日访问(713)评论(1)

eoe客户端开源了,下载看看,先找入口,结果就在manifest里看到个android:launchMode="singleTask",一来就是个我没见过的,好吧,也可能书上有说过,但是好像重来就不用啊,只能去好好理解下了,刚好耗子也有提到过这个,就直接看了下她提供的链接,http://blog.youkuaiyun.com/leiswpu/article/details/6248528,这个里面说的确实比较容易明白,
为了省的还要跑过去看,也为了以防万一,我还是再复制一遍过来吧。。。

在Android的联机文档中,有对Activity的简单介绍,现在通过编写代码对Activity的启动模式做一个深入的理解。
在配置文件AndroidManifest.xml中,activity元素的android:launchMode属性用来配置对应Activity的启动模式,目前有以下四种启动模式:
1.standard
2.singleTop
3.singleTask
4.singleInstance
如果不对Activity设置启动模式,默认就是standard模式

一、standard

请看以下代码,实现了一个Activity :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class A_Activity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        TextView textView=new TextView(this); 
        textView.setText(this+"");//这里用于打印当前Activity的hashcode,可以此判断Activity实例是不是同一个对象 
        Button button=new Button(this); 
        button.setText("Go next activity"); 
        button.setOnClickListener(new OnClickListener(){

            public void onClick(View v) { 
                // TODO Auto-generated method stub 
                Intent intent=new Intent(); 
                intent.setClass(A_Activity.this, A_Activity.class);//说明发出Intent与启动的Activity都是A_Activity的实例
                startActivity(intent); 
            } 
        }); 
        LinearLayout layout=new LinearLayout(this); 
        layout.setOrientation(LinearLayout.VERTICAL); 
        layout.addView(textView); 
        layout.addView(button); 
        setContentView(layout); 
    } 
} 

运行之,请看下图:
001.jpg
点击button后,注意看第一行的textView
002.jpg
由此可知,生成了新的A_Activity对象,这时我们按回退键,就会依次回到之前的Activity。点击button的过程就是压栈的过程,在standard模式下,就会不断生成新的Activity对象

二、singleTop

singleTop和standard模式都会将intent发送给新的Activity实例,不同的是,如果创建Intent的时候栈顶有要创建的singleTop模式下的Activity实例,则将Intent发送给该实例,不会再创建Activity的新实例。
还是使用之前的代码,只是设置A_Activity的启动模式为singleTop:android:launchMode="singleTop",运行之,请看下图:
003.jpg
这个时候我们无论点击多少次button,textView都显示同一个Activity实例,按回退键时会直接退出程序,表明在singleTop模式下,如果在栈顶存在Intent中那个目标Activity的实例,就不会创建新的实例,而直接使用栈顶的对象,对于资源有限的移动设备来说,也是有实际意义的。
如果是在不同Activity之间跳转,就会跟standard模式的情形一样,请看下面代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class A_Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView textView=new TextView(this);
        textView.setText(this+"");
        Button button=new Button(this);
        button.setText("Go B_Activity");
        button.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent=new Intent();
                intent.setClass(A_Activity.this, B_Activity.class);//从A跳转到B 
                startActivity(intent);
            }
        });
        LinearLayout layout=new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.addView(textView);
        layout.addView(button);
        setContentView(layout);
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class B_Activity extends Activity { 
    /**<li>Description: </li>
     *
     * @param savedInstanceState
     * @see android.app.Activity#onCreate(android.os.Bundle)
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        TextView textView=new TextView(this);
        textView.setText(this+"");
        Button button=new Button(this);
        button.setText("Go A_Activity");
        button.setOnClickListener(new OnClickListener(){ 
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent=new Intent();
                intent.setClass(B_Activity.this, A_Activity.class);//从B跳转到A
                startActivity(intent);
            }
        });
        LinearLayout layout=new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.addView(textView);
        layout.addView(button);
        setContentView(layout);
    }
}

运行后,如下图:
004.jpg
点击button后:
005.jpg
再点击button后:
006.jpg
这样每次都会创建目标Activity的新实例,因为在跳转时,处于栈顶的对象不是目标Activity的实例

三、singleTask

singleTask模式只能创建一个实例,当发送一个Intent,目标Activity为singleTask模式时,系统会检查栈里面是否已经有该Activity的实例,如果有就直接将Intent发送给它,还是使用(二)中的代码,将A_Activity启动模式设置为singleTask,B_Activity启动模式设置为standard,启动后如下图:
007.jpg
点击button后:
008.jpg
继续点击button:
009.jpg
由此可知,singleTask模式的A_Activity在栈中只有一个实例,可以被重复使用
并且,如果收到Intent生成一个新实例,那么用户可以通过回退键回到上一个状态,如果是已经存在的一个activity来处理这个Intent的话,就无法通过回退键回到上一个状态(对singleInstance同样适用) ,比如刚才最后一步如果再按回退键,就会直接退出程序,而不会回到上一步的状态。

四、singleInstance

这个模式下的Activity在一个单独的task栈中,这个栈也只能包含一个Activity的实例,将上面代码稍微改动一下,显示taskId:
A_Activity 中:textView.setText(this.getTaskId()+"");
B_Activity 中:textView.setText(this.getTaskId()+"");
另外将B_Activity 设置为singleInstance模式,A_Activity 设置为standard模式,启动后:
010.jpg
点击button后:
011.jpg
表明启动了新的task

总结四个模式的不同:
1、Intent的目标Activity由哪个task持有
standard与singleTop的Activity所在task,与收到的Intent的发送者所在task相同,除非Intent包括参数FLAG_ACTIVITY_NEW_TASK,该参数会启动Activity到新的task中;singleTask和singleInstance总是把Activity作为一个task的根元素,它们不会被启动到其他task里
2、是否允许Activity的多个实例
standard与singleTop可以被实例化多次,可以存在不同task中,并且一个task可以包括同一activity的多个实例
singleTask与singleInstance则在同一个task中只能允许Activity的一个实例,并且是task的根元素
3、在同一个task栈中,是否允许其他Activity的实例存在
singleInstance单独在一个task中,其他启动模式允许不同Activity的实例存在
4、是否每次生成新实例接收Intent
standard每次启动都会生成新实例
singleTop的activity如果在task的栈顶的话,则不生成新的activity实例,直接使用该实例,否则,就要生成新的实例
singleInstance在所在栈中是唯一的activity,它每次都会被重用
singleTask如果task栈中有该模式的Activity,就不生成新的activity实例,直接使用该实例,否则,就要生成新的实例

也看过一些自己找的,会有配图:
(1)standard

standard.gif

(2)singleTask
singleTask.gif

可以将TaskA TaskB理解为两个应用,比如TaskA是你当前的应用,TaskB是默认浏览器。
当到了TaskB中后,按返回键,需要先在TaskB中返回到root,然后才能返回到TaskA。

总结成以下几句:
standard 每次都会新建,每个Task都可以有,且每个Task都可以有多个实例(每个Task都可以有,且可以有多个)

singleTop 当前实例如果在栈顶,就不新建实例,调用其OnNewIntent。 如不在栈顶,则新建实例 (每个Task都可以有,且可以有多个,在栈顶时可复用)

singleTask 新建一个Task,如果已经有其他的Task并且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)

singleInstance 新建一个Task,且在该Task中只有它的唯一一个实例。 (只有一个Task会有,且该Task中只有它)

反正最好最快的理解方法就是写个例子,直接运行一下。。。

声明:eoe文章著作权属于作者,受法律保护,转载时请务必以超链接形式附带如下信息

原文作者: 樱蝴蝶

原文地址: http://my.eoe.cn/yinghudie/archive/3184.html

Android四大组件之Activity(四)—— 启动模式(launchMode) + Pause上一个Activity 1、使用的是Android 7.1.2的源代码: https://pan.baidu.com/s/1XcVD68cC_2wKtm8jJkdNQA przv 2、感谢IT先森的系列博客: Android应用进程创建流程大揭秘 Android四大组件之bindService源码实现详解 Android四大组件之Activity启动流程源码实现详解概要 Activity启动流程(一)发起端进程请求启动目标Activity Activity启动流程(二)system_server进程处理启动Activity请 阅读详情

相关推荐

从仿真到真机:如何将XTDrone的VINS-Fusion+RTABMap建图方案部署到真实无人机上?

本文详细介绍了如何将XTDrone的VINS-Fusion+RTABMap建图方案从仿真环境迁移到真实无人机上。内容涵盖硬件选型、传感器配置、VINS-Fusion调优、RTABMap性能优化以及系统集成等关键步骤,特别针对三维稠密重建在真实环境中的挑战提供了实用解决方案。

weixin_29056781的博客 242

基础总结篇之二:Activity的四种launchMode

合抱之木,生於毫末;九層之台,起於累土;千里之行,始於足下。《老子》 今天在社区看到有朋友问“如何在半年内成为顶级架构师”,有网友道“关灯睡觉,不用半年的...”,的确,做梦还来的快一些。作为一个程序员,树立远大的目标是值得欣赏的,但不能只去空想,要一步一步地实践才行。成大事者,须从小事做起;万事起于忽微,量变引起质变。 我们今天要讲的是Activity的四种launchMode。 laun...

t225com 1263

医学影像AI的幻觉问题与CCD解决方案

医学影像AI在辅助诊断中面临的核心挑战是幻觉现象,即模型生成不符合实际影像的虚假诊断。这种现象源于多模态大语言模型(MLLMs)在视觉-语言对齐上的技术局限,可能导致假阳性或假阴性的临床风险。通过临床对比解码(CCD)框架,结合症状锚定和专家引导的双阶段校准机制,可有效提升模型输出的可靠性。该技术在CheXpert和MIMIC-CXR等标准数据集上验证,显著改善了肺不张、胸腔积液等关键指标的检测准确率。对于医疗AI落地场景,这种即插即用的解决方案既规避了数据隐私合规问题,又降低了基层医院的部署门槛,为AI辅

weixin_36303807的博客 322

Android中launcherMode="singleTask"详解【android源码解析六】

android中launcherMode有4中属性:standard(默认), singleTop,singleTask和 singleInstance;网上有好多例子讲解这四种关系的:下面我列举几个链接: 大明原创----&gt;转载请标明出处:http://blog.youkuaiyun.com/wdaming1986/article/details/7304191 http://www.cn...

dowhathowtodo 736

Score Matching(得分匹配)

Score Matching(得分匹配)是一种统计学习方法,用于估计概率密度函数的梯度(即得分函数),而无需知道密度函数的归一化常数。这种方法由Hyvärinen在2005年提出,主要用于无监督学习,特别是在密度估计和生成模型中。

weixin_39699362的博客 2167

codevs 1620 轮船问题 DP 解题报告

某国家被一条河划分为南北两部分,在南岸和北岸总共有N对城市,每一城市在对岸都有唯一的友好城市,任何两个城市都没有相同的友好城市。

Hawo11的博客 817

android:launchMode=“singleTask“

android中launcherMode有4中属性也可以称为四种启动模式:standard(默认), singleTop,singleTask和 singleInstance;      <activity android:name="com.air.chinesetea.HomeActivity" android:launchMode="singleTask" android:screenOrientation="por

GuoGuoABC 2771

智能网联汽车云控系统核心解析:车云数据交互协议设计与实践

本文深入解析了智能网联汽车云控系统的核心——车云数据交互协议的设计与实践。文章围绕“说什么”、“怎么说”及异常处理三大核心问题,详细阐述了二进制与结构体数据类型定义、TCP/UDP双通道传输机制、通用报文格式以及典型交互流程(如GLOSA车速引导),并分享了时间同步、坐标系定义等关键实战经验与避坑指南,为构建高效、可靠、安全的车云“神经系统”提供专业指导。

alice7model的博客 121

关于android:launchMode=“singleInstance”

1、关于设置android:launchMode=“singleInstance” 后返回键问题:       有三个Activity:A、B、C。          A的launchMode为singleInstance,          B、C为默认的standard,          第一次A--B--C--A跳完之后,为什么从A进入了C并且是之前的实例C,而不是想象中的新创建一

松狮 7353

11、牛转录组分析的实用生物信息学流程

本文详细介绍了一套实用的牛转录组分析生物信息学流程,涵盖从数据提取、基因组索引生成、读取比对到单样本表达分析及差异表达分析的完整步骤。使用Angus和Brahman牛的RNA-seq数据作为示例,介绍了HTSEQ、featureCounts和StringTie等工具在基因表达计数中的应用,并结合edgeR和limma进行差异表达分析。文中提供了详细的命令行与R代码示例,包含常见问题解答与关键注意事项,帮助研究人员高效、准确地完成转录组数据分析。

ios99的博客 111

谁还攥着旧的类加载器:Metaspace OOM 的元数据记账、类卸载条件与泄漏定位解析

MetaSpace区是JVM内存管理中的关键部分,负责存储类元数据。随着Java 8的推出,MetaSpace取代了PermGen区,但其灵活性也带来了新的挑战,尤其是在动态类加载和频繁类更新的场景下,容易导致MetaSpace内存溢出(OOM)问题。本文探讨了MetaSpace OOM的根本原因,包括类加载器泄漏、内存管理不当和GC效率低下等,并提供了一系列调优策略和解决方案,帮助开发者有效排查和防止此类问题的发生,确保应用程序的稳定性和高可用性。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

Android中LaunchMode详解

越是做的时间越长,基础知识就忘的越干净,最近做一个项目中,发现启动的几个Activity居然重叠了,我ri~~,再不回忆一下就要退出Android界了。概念解释TaskTask叫做任务,这个简单,表示我们需要完成的事情,注意,这里我们说的是任务,是个名词,例如要发短信,那我们的任务就是发送一条短信,仅此而已,再例如教官说:”张三,你去吃屎!”,ok,那张三的任务就是吃屎。Back Stack我们常叫

哎呦哥哥的博客 6141

Google Gemini 模型本地可视化

Google近期发布了Gemini模型,而且开放了Gemini Pro API,Gemini Pro 可免费使用!Gemini Pro支持全球180个国家的38种语言,目前接受文本、图片作为输入并生成文本作为输出。Gemini Pro的表现超越了其他同类模型,当前版本配备了 32K 文本上下文窗口,可免费使用,且其定价将十分有竞争力。Gemini Pro具备丰富的功能:函数调用、数据嵌入、语义检索、自定义知识嵌入以及聊天功能。

HJ_blog 1246

android深入解析Activity的launchMode启动模式,Intent Flag,taskAffinity

最近看到一篇文章讲launchMode,想到以前的一次面试,就问了这一个问题,最基本的大家都知道,但是详细的我就迷糊了,最终失败了,所以在此总结一下,希望能够帮助一下大家LaunchMode  launchMode分为四种:    standard  standard启动模式为最基本的启动模式,默认为该种启动模式,特点就是每当发送一个intent请求打开该activity时,都会创建一个新的ac

Shawn_Dut的专栏 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android之LaunchMode(启动模式)

Android之LaunchMode(启动模式) 文章目录Android之LaunchMode(启动模式)Activity的4种启动模式1.1 standard ------ 标准模式1.2 singleTop1.3 singleTask1.4 singleInstance Activity的4种启动模式 注意: Activity的启动模式将会影响到手机系统的任务栈, 所以想深刻的理解启动模式,一定要先了解怎么去看任务栈,其实很简单输入一条命令即可 adb shell dumpsys activity -

Demon_T的博客 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LaunchMode——Android中Activity的启动模式

LaunchMode是什么和4种模式的介绍和使用场景

weixin_63424693的博客 1599

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android LaunchMode启动模式详解

那为啥需要启动模式呢?对,需求是所有东西被建立或者被制造出来的原因,因为我们对Actiivty有不同的需求,举个老生常谈的发邮件例子,邮件主页Activity要求不论怎么打开,打开多少次,就只能有一个主页Activity的实例,对吧,如果有多个实例我们就很麻烦,不知道显示哪个,也不知道要关闭哪个,那这就是个需求,对应这个需求,我们就需要对这个主页Activity设置一种启动模式,不论怎么打开就只有一个实例,这样需求就满足啦。顾名思义,LaunchMode就是启动模式,啥是启动模式?

qq_38056514的博客 3769

Android 之 Activity 的启动模式(launchMode)

在实际项目中,应该根据项目的实际需要来为每个指定恰当的启动模式。启动模式一共有四种,分别是。可以在中通过给标签指定属性来选择启动模式。

casual_clover的博客 1740

Android安卓 Activity四种启动模式(launchMode) standard, singleTop, singleTask, singleInstance

启动模式的重要性 Android编程中经常涉及到页面的切换,启动一个新的页面(或者说Activity)的时候需要为其指定合适的“启动模式”。指定的启动模式不合适,会出现类似下面这种奇怪的效果: 你拿起QQ切换了一个新的账号,一直按返回却没有退出程序,而是又回到了旧帐号对应的页面… 你拍完照进相册看了一下刚刚拍的照片又退出,却发现拍照界面出现了黑屏… 这些情况的出现当然可能和其他的原因相关,...

qq_44861716的博客 2700

【Android】Activity的启动模式

本文介绍了Activity设置启动模式的两种方式,设置android:launchMode属性和设置Intent Flag,Standard——标准模式,SingleTop——栈顶模式,taskAffinity介绍,singleTask——单栈模式,singleinstance——单例模式,singleInstancePerTask——每个任务的单例模式,如何知晓当前所处的活动位置,随时退出程序这些技术。

摸鱼小小虫的博客 5101

Activity 的启动模式,附安卓面经

在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。对你有帮助,可以添加下面V无偿领取!(备注Android)**

2201_75604341的博客 949

Android Activity launchMode研究

在singleInstance中启动的activity也不会跟它放在同一个task里, 根据要启动的activity的taskAffinity选择,可能在其他已有的task里,也可能开启新的task, 总之不是在singleInstance的task里.为singleTask的activity指定一个新的taskAffinity后,singleTask的activity得到的taskId就和standard的不同了, 说明这时候开启了一个新的task.如果该task不存在,才会新建一个task.

weixin_45298122的博客 954

安卓Activity的启动模式

Activity的启动模式

qq_37465077的博客 2554

16.Android Activity的launchMode

Android Activity的launchModeAndroid Activity的launchMode Activity Task standard Android 5点0之前 Android 5点0之后 使用场景 singleTop 5点0前后和standard一样 使用场景 singleTask 一个App中 不同App Google关于singleTask的描述 taskAffinity

Save you from anything 5098
上一篇: Android杂谈--网络状态判断(3G/WIFI)
下一篇: Android电池矫正方法
androidboy365
博客等级 码龄16年 35粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值