【Android 应用开发】Android 返回堆栈管理 ( 默认启动模式 | 栈顶复用启动模式 | 栈内复用启动模式 | 单实例启动模式 | CLEAR_TOP 标识 )

简介: 【Android 应用开发】Android 返回堆栈管理 ( 默认启动模式 | 栈顶复用启动模式 | 栈内复用启动模式 | 单实例启动模式 | CLEAR_TOP 标识 )

文章目录

I . 默认启动模式 ( standard )

II . 栈顶复用启动模式 ( singleTop )

III . 栈内复用启动模式 ( singleTask )

IV . 单实例启动模式 ( singleInstance )

V . 栈内复用 FLAG 标识 ( FLAG_ACTIVITY_CLEAR_TOP )



I . 默认启动模式 ( standard )


默认模式 ( standard ) : 最简单的模式 , 每次启动一个 Activity 就创建一个新的 Activity 实例 , 放入返回堆栈中 ;



AndroidMenifest.xml 设置方式 :


<activity
     android:name=""
     android:launchMode="standard"/>


总结 : 默认模式下 , Activity 是可以实例化多次的 , 返回堆栈内可以相邻存放相同的 Activity 界面实例 ;




II . 栈顶复用启动模式 ( singleTop )


栈顶复用模式 ( singleTop ) : 要跳转到 Activity X ;


① 如果 发现当前返回堆栈栈顶的界面就是 Activity X 实例 , 会直接调用该 Activity X 实例 的 onNewIntent() 方法 , 将跳转用的 Intent 转给栈顶的 Activity X 实例 , 不再创建新的界面入栈 ;


② 如果 返回堆栈 内没有 Activity X 实例 , 那么创建一个新 Activity X 实例并入栈 ;


③ 如果返回堆栈内 有 Activity X 实例 , 但是没有在栈顶 , 那么也创建一个新 Activity X 实例并入栈 ;



AndroidMenifest.xml 设置方式 :


<activity
     android:name=""
     android:launchMode="singleTop"/>


Intent 标志位 设置方式 :


Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);



III . 栈内复用启动模式 ( singleTask )


独立任务 启动模式 ( singleTask ) : 要跳转到 Activity X ;


① 发现 现有任务的 返回堆栈中存在 Activity X 实例 , 会直接调用该 Activity X 实例 的 onNewIntent() 方法 , 将跳转用的 Intent 转给栈顶的 Activity X 实例 , 不再创建新的界面入栈 , 同时会将返回堆栈内该 Activity X 实例之上的 Activity 界面进行出栈操作 ;


② 如果现有任务中不存在该实例 , 那么会创建新的 任务 及 返回堆栈 , 实例化新的 Activity X 对象 , 并当做根 Activity ;



使用场景 : 在自己的应用中 , 启动第三方浏览器 或 播放器 , 那么这些第三方的应用界面 , 不应该加入到自己开发的任务栈中 , 而是创建一个新任务 , 将这些第三方的应用启动界面 , 放入新的返回堆栈中 , 这些启动界面应该设置成 singleTask 模式 ;


如果这些第三方应用已经被启动过 , 在后台运行 , 那么再次启动会将这个界面所在的任务转到前台运行 ;



AndroidMenifest.xml 设置方式 :


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



Intent 标志位 设置方式 :


Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);



要注意区分 栈内复用模式 ( singleTask 启动模式 ) 与 Intent 标志位 : Intent.FLAG_ACTIVITY_CLEAR_TOP 的区别 , 这两个设置的行为不完全一致 ;

FLAG_ACTIVITY_CLEAR_TOP 标志位不会启动新的任务 ;



一般情况下 , 在应用中是不适用该启动模式的 , 常用 FLAG_ACTIVITY_CLEAR_TOP 与 默认启动模式 ( standard ) 结合的方式实现 返回堆栈内只有一个 特定的 Activity ;




IV . 单实例启动模式 ( singleInstance )


单实例启动模式 ( singleInstance ) : 要跳转到 Activity X ( singleInstance 启动模式 ) ;


① 不存在实例 : 如果当前所有任务中 , 都没有 Activity X 实例 , 那么在一个新任务中创建 Activity X 实例 , 并放入返回堆栈 栈底 ;


② 存在实例 : 如果当前其它任务中有该实例 , 那么通过调用 onNewIntent() 方法转到该实例 ;


③ 独占返回堆栈 : 该 Activity X 实例所在的堆栈只有一个界面实例 , 即 一个任务只有这唯一的一个 界面 ;


④ 启动其它界面 : 在该 单实例启动模式 ( singleInstance ) 界面中启动其它界面 , 都在其它的任务中打开 , 本任务只能有这一个界面 ;



AndroidMenifest.xml 设置方式 :


<activity
     android:name=""
     android:launchMode="singleInstance"/>



这个模式一般也不常用 ;




V . 栈内复用 FLAG 标识 ( FLAG_ACTIVITY_CLEAR_TOP )


1 . FLAG_ACTIVITY_CLEAR_TOP 标识 : 要跳转到 Activity X ;


① 存在该 Activity 实例 : 发现当前返回堆栈中存在 Activity X 实例 , 会直接调用该 Activity X 实例 的 onNewIntent() 方法 , 将跳转用的 Intent 转给栈顶的 Activity X 实例 , 不再创建新的界面入栈 , 同时会将返回堆栈内该 Activity X 实例之上的 Activity 界面进行出栈操作 ;


( 这个操作与栈内复用启动模式相同 , 但是仅限于返回堆栈中存在该实例的情况 , 如果不存在 , 就要执行别的操作 )


② 不存在该 Activity 实例 : 如果当前返回堆栈中没有该 Activity X 实例 , 就需要根据该 Activity 配置的启动模式的行为来启动新的界面 ;



2 . Intent 标志位 设置方式 :


Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);


3 . 常用场景 : 经常使用 FLAG_ACTIVITY_CLEAR_TOP 与 默认启动模式 ( standard ) 结合的方式实现 返回堆栈内只有一个 特定的 Activity ;


① 不存在 : 当前返回堆栈中如果没有该界面 , 那么创建一个新的界面 , 放入该返回堆栈中 ;


② 存在 : 当前返回堆栈中如果有该界面 , 那么直接复用该界面 , 该界面上面的 Activity 直接退栈处理 ;


目录
相关文章
|
3月前
|
数据采集 小程序 数据可视化
智慧校园电子班牌管理系统源码 Java Android原生
家长通过家长小程序端随时了解孩子在校的情况,实时接收学生的出勤情况,学生到校、离校时间。随时了解学生在校的表现、学生成绩排名,及时与教师沟通,关注孩子的健康成长。
31 0
智慧校园电子班牌管理系统源码 Java Android原生
|
5月前
|
Java 关系型数据库 MySQL
0002Java安卓程序设计-基于Uniapp+springboot菜谱美食饮食健康管理App2
0002Java安卓程序设计-基于Uniapp+springboot菜谱美食饮食健康管理App
34 0
|
7月前
|
Shell Android开发 容器
你真了解Android任务栈 Task 与启动模式吗?
你真了解Android任务栈 Task 与启动模式吗?
62 0
|
5天前
|
存储 开发工具 Android开发
Android系统 权限组管理和兼容性
Android系统 权限组管理和兼容性
14 0
|
1月前
|
Shell 开发工具 Android开发
ADB 下载、安装及使用教程:让你更好地管理 Android 设备
ADB 下载、安装及使用教程:让你更好地管理 Android 设备
523 2
|
5月前
|
Android开发
0002Java安卓程序设计-基于Uniapp+springboot菜谱美食饮食健康管理App1
0002Java安卓程序设计-基于Uniapp+springboot菜谱美食饮食健康管理App
61 0
|
1月前
|
Android开发
Android的启动模式
Android的启动模式
13 0
|
6月前
|
存储 安全 Java
Android DataStore:安全存储和轻松管理数据
Android DataStore:安全存储和轻松管理数据
|
2月前
|
小程序 Java 数据挖掘
Java校园智慧管理云平台源码 小程序+android电子班牌系统
智慧校园技术架构 ❀后端:Java ❀框架:springboot ❀前端页面:vue +element-ui ❀小程序:小程序原生开发 ❀电子班牌:Java Android
36 0