Activity启动模式(launchMode)详解

简介:
本文讲的是 Activity启动模式(launchMode)详解, Activity的启动模式有四种,standard、singleTop、singleTask、singleInstance.

1.standard

standard是Activity默认的启动模式,在不进行显示指定的情况下,所有活动都会自动使用这种启动模式。

每次启动都一个新的Activity位于栈顶。

android:launchMode="standard",此时每次点击按钮都会创建新的Activity

现在,我们写一个简单的按钮 ,实现跳转Activity


 
 
  1. private Button button; 
  2.     @Override 
  3.     protected void onCreate(Bundle savedInstanceState) { 
  4.         super.onCreate(savedInstanceState); 
  5.         setContentView(R.layout.activity_main); 
  6.         Log.e("MainActivity",this.toString()); 
  7.         button = (Button)findViewById(R.id.button); 
  8.         button.setOnClickListener(new View.OnClickListener() { 
  9.             @Override 
  10.             public void onClick(View view) { 
  11.                 Intent intent = new Intent(MainActivity.this, MainActivity.class); 
  12.                 startActivity(intent); 
  13.             } 
  14.         }); 
  15.     }  

虽然跳转的页面相同,但是在Task中每点一次按钮就会创建一个新的Activity

Activity创建日志

启动示例图

2.singleTop

当Activity的启动模式为singleTop时,当启动的Activity已经处于Activity栈顶时,则直接使用。

android:launchMode="singleTop"

我们创建NextActivity,并且在MainActivity中添加button2


 
 
  1. private Button button1,button2; 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.activity_main); 
  7.         Log.e("MainActivity", this.toString()); 
  8.         button1 = (Button) findViewById(R.id.button1); 
  9.         button2 = (Button) findViewById(R.id.button2); 
  10.         button1.setOnClickListener(this); 
  11.         button2.setOnClickListener(this); 
  12.  
  13.     } 
  14.  
  15.     @Override 
  16.     public void onClick(View view) { 
  17.         switch (view.getId()){ 
  18.             case R.id.button1: 
  19.                 Intent intent = new Intent(MainActivity.this, MainActivity.class); 
  20.                 startActivity(intent); 
  21.                 break; 
  22.             case R.id.button2: 
  23.                 Intent intent2 = new Intent(this, NextActivity.class); 
  24.                 startActivity(intent2); 
  25.                 break; 
  26.         } 
  27.     }  

此时在MainActivity中启动MainActivity,则Activity栈中只会创建一次;但是先启动NextActivity之后再启动MainActivity,则会创建新的MainActivity,因为此时的Activity栈顶是NextActivity

MainActivity ->MainActivity ->MainActivity

MainActivity -> NextActivity -> MainActivity

启动示例图

3.singleTask

当活动的启动模式为singleTask时,启动该Activity会现在栈中检查是否已存在,若存在则直接将该活动之上的Activity全部出栈。

android:launchMode="singleTask"

启动示例图

4.singleInstance

singleInstance模式下会有一个单独的返回栈来管理活动。不管哪个应用程序来访问该活动,都共用同一个栈,这样就可以允许其他程序调用,实现共享该活动。

android:launchMode="singleInstance"

启动示例图

图中启动的过程是:Main -> New -> Next 这个过程很容易看懂

返回过程是:Next -> Main -> New

明显看出顺序不一样,为什么会出现这种情况呢?

NextActivity和MainActivity处于同一个栈,当我们返回时,NextActivity出栈,此时栈A中还存在MainActivity,并且处于栈顶,所以会看到MainActivity.

当MainActivity执行返回时,栈A会清空,然后我们就看到了位于栈B的NewActivity。

之后NewActivity出栈,栈B也为空时,App退出。

Activity的启动模式简单介绍到这里, 希望对您有所帮助,有不足或者错误的地方请指正。

后面会每星期至少一篇跟新本系列,感兴趣可以关注。

一起学习,一起进步。


本文作者:佚名

来源:51CTO

原文标题:Activity启动模式(launchMode)详解
相关文章
|
安全 Java
【面试】Java集合中List,Set以及Map等集合体系详解
【面试】Java集合中List,Set以及Map等集合体系详解
185 0
fetch上传文件报错的问题(multipart: NextPart: EOF)
技术栈 后台: gin(golang) 前端: react+antd+dva 问题 前端这边使用fetch发送http请求的时候,后端解析formData报错: multipart: NextPart: EOF 分析问题 原因是上传文件太小了Content-Length数量太小了,尝试将headers里这字段的value变大,发现实际的请求依然是较小值。
|
2月前
|
运维 监控 Linux
Linux系统设置与理解主机名(hostname)的重要性
综上所述,合理配置和维护主机名不仅是Linux系统管理的基础,而且对于网络服务的稳定运行以及
261 13
|
8月前
|
存储 人工智能 Cloud Native
小鹏汽车选用阿里云PolarDB,开启AI大模型训练新时代
PolarDB-PG云原生分布式数据库不仅提供了无限的扩展能力,还借助丰富的PostgreSQL生态系统,统一了后台技术栈,极大地简化了运维工作。这种强大的组合不仅提高了系统的稳定性和性能,还为小鹏汽车大模型训练的数据管理带来了前所未有的灵活性和效率。
|
2月前
|
搜索推荐 算法 大数据
基于python大数据的旅游景点可视化与推荐系统
本系统基于大数据与网络技术,构建个性化旅游推荐平台。通过收集用户偏好及行为数据,结合机器学习算法,提供精准的旅游目的地、住宿及交通推荐,旨在优化旅游信息传递,提升用户决策效率与旅行体验。
|
7月前
|
存储 Ubuntu Linux
Linux系统安装对硬件的需求
总的来说,Linux系统对硬件的需求并不高,它可以在很多年代久远的硬件上运行。但是,如果你想得到更好的体验,那么你可能需要更强大的硬件。在选择硬件时,你需要考虑你的使用需求,以及你打算安装的Linux发行版的需求。
325 25
|
安全 API Android开发
Android 15: 迈向64位时代的重大更新与全新体验
2024年,Google发布Android 15,迈向64位计算新时代。新系统淘汰32位应用,引入多项性能优化与新特性,如矢量emoji、预测性返回动画等,并预计随Pixel 9系列一同发布。开发者需更新应用确保兼容性,并利用新功能提升用户体验。
3611 15
Android 15: 迈向64位时代的重大更新与全新体验
|
分布式计算 资源调度 Hadoop
在Linux系统上安装Hadoop的详细步骤
【1月更文挑战第4天】在Linux系统上安装Hadoop的详细步骤
1502 0
|
关系型数据库 MySQL 数据库
MySQL回滚工具:binlog 闪回工具 MyFlash工具
MySQL回滚工具:binlog 闪回工具 MyFlash工具
|
机器学习/深度学习 算法 文件存储
使用Python实现深度学习模型:神经架构搜索与自动机器学习
【7月更文挑战第5天】 使用Python实现深度学习模型:神经架构搜索与自动机器学习
305 2