【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 直接退栈处理 ;


目录
相关文章
|
2月前
|
存储 XML 开发工具
探索安卓应用开发:从基础到进阶
在这篇文章中,我们将一起踏上安卓应用开发的旅程。不论你是编程新手还是希望提升技能的开发者,这里都有你需要的东西。我们会从最基础的概念开始,逐步深入到更复杂的主题。文章将涵盖开发环境设置、用户界面设计、数据处理以及性能优化等方面。通过理论与实践的结合,你将能够构建出既美观又高效的安卓应用。让我们一起开启这段技术之旅吧!
|
2月前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
3月前
|
Android开发 Swift iOS开发
iOS和安卓作为主流操作系统,开发者需了解两者差异以提高效率并确保优质用户体验。
【10月更文挑战第1天】随着移动互联网的发展,智能手机成为生活必需品,iOS和安卓作为主流操作系统,各有庞大的用户群。开发者需了解两者差异以提高效率并确保优质用户体验。iOS使用Swift或Objective-C开发,强调简洁直观的设计;安卓则采用Java或Kotlin,注重层次与动画。Swift和Kotlin均有现代编程特性。此外,iOS设备更易优化,而安卓需考虑更多兼容性问题。iOS应用仅能通过App Store发布,审核严格;安卓除Google Play外还可通过第三方市场发布,审核较宽松。开发者应根据需求选择合适平台,提供最佳应用体验。
75 3
|
3月前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
3月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
109 0
|
28天前
|
搜索推荐 Android开发 开发者
安卓应用开发中的自定义控件实践
在安卓应用开发的广阔天地中,自定义控件如同璀璨的星辰,点亮了用户界面设计的夜空。它们不仅丰富了交互体验,更赋予了应用独特的个性。本文将带你领略自定义控件的魅力,从基础概念到实际应用,一步步揭示其背后的原理与技术细节。我们将通过一个简单的例子——打造一个具有独特动画效果的按钮,来展现自定义控件的强大功能和灵活性。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往更高阶UI设计的大门。
|
2月前
|
缓存 监控 前端开发
探索Android应用开发之旅:从新手到专家
【10月更文挑战第42天】本文将带你踏上Android应用开发的旅程,无论你是初学者还是有经验的开发者。我们将一起探索如何从零开始创建你的第一个Android应用,并逐步深入到更高级的主题,如自定义视图、网络编程和性能优化。通过实际示例和清晰的解释,你将学会如何构建高效、吸引人的Android应用。让我们一起开启这段激动人心的旅程吧!
|
2月前
|
开发框架 前端开发 Android开发
探索安卓和iOS应用开发中的跨平台解决方案
【10月更文挑战第42天】在移动应用开发的广阔天地中,安卓和iOS系统如同两座巍峨的山峰,分别占据着半壁江山。开发者们在这两座山峰之间穿梭,努力寻找一种既能节省资源又能提高效率的跨平台开发方案。本文将带你走进跨平台开发的世界,探讨各种解决方案的优势与局限,并分享一些实用的代码示例,助你在应用开发的道路上更加游刃有余。
|
2月前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
2月前
|
传感器 XML IDE
探索安卓应用开发:从基础到进阶
【10月更文挑战第23天】在数字化时代的浪潮中,移动应用已成为人们日常生活的延伸。本文以安卓平台为例,深入浅出地介绍了如何从零开始构建一个安卓应用,涵盖了开发环境搭建、基本组件使用、界面设计原则以及进阶技巧等关键步骤。通过实例演示和代码片段,引导读者逐步掌握安卓应用开发的核心技能,旨在激发更多开发者对安卓平台的探索热情,并为初学者提供一条清晰的学习路径。