想了解Android四种启动模式LanchMode的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于android四种启动模式的相关问题,此外,我们还将为您介绍关于Activity启动模式la
想了解Android四种启动模式LanchMode的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于android四种启动模式的相关问题,此外,我们还将为您介绍关于Activity启动模式 launchMode、Activity启动模式----LaunchMode、Activity的launchMode启动模式 day7、Android (Launch Mode) 四种启动模式的新知识。
本文目录一览:- Android四种启动模式LanchMode(android四种启动模式)
- Activity启动模式 launchMode
- Activity启动模式----LaunchMode
- Activity的launchMode启动模式 day7
- Android (Launch Mode) 四种启动模式
Android四种启动模式LanchMode(android四种启动模式)
Activity 的 LaunchMode
默认情况下,多次启动同一个 Activity 时,系统会创建多个实例并把它们一一放入任务栈中,当我们按 back 健时,这些 Activity 会一一回退。任务栈是一种“后进先出”的栈结构,即每按一下 back 健就会有一个 Activity 出栈,直到栈空为止,当栈中无任何 Activity 时,系统会回收这个任务栈。 四种启动模式:standard、singletop、singleTask 和 singleInstance。下面介绍各种启动模式的含义及使用例子。
一、standard – 默认模式
standard:标准模式也是系统的默认模式。每次启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否已经存在。这种模式下,谁启动了这个 Activity,那么这个 Activity 就运行在启动它的那个 Activity 所在的栈中。如 Activity A 启动了 Activity B(B 是标准模式),那么 B 就会进入到 A 所在的栈中。
二、singletop – 栈顶复用模式
singletop 栈顶复用模式。如果新 Activity 已经位于任务栈的栈顶,那么此 Activity 不会被重新创建,同时它的 onNewIntent 方法会被调用,通过此方法的参数可以取出当前请求的信息。需要注意的是,这个 Activity 的 onCreate、onStart 不会被系统重新调用,因为它并没有发生改变。如果新 Activity 的实例已经存在但不是位于栈顶,那么新 Activity 仍然会重建。 适合接收通知启动的内容显示页面,当收到多条新闻推送时,用于展示新闻的 Activity 设置成此模式,根据传来的 Intent 数据显示不同的新闻信息,不会启动多个 Activity。
三、singleTask – 栈内复用模式
singleTask:栈内复用模式。这是一种单实例模式,在这种模式下,只要 Activity 在一个栈中存在,那么多次启动此 Activity 都不会重新创建实例,复用时会将它上面的 Activity 全部出栈,同时它的 onNewIntent 方法会被调用。这个过程存在一个任务栈匹配,因为这个模式启动时会在自己需要的任务栈中寻找实例,这个任务栈通过 taskAffinity 属性指定,如果这个任务栈不存在,则会创建这个任务栈。 taskAffinity 标识了一个 Activity 所需的任务栈的名字,默认情况下,所有 Activity 所需的任务栈的名字为应用的包名。我们可以为每个 Activity 都单独指定 TaskAffinity 属性,这个属性必须不能和包名相同,否则就相当于没有指定。TaskAffinity 属性主要和 singleTask 启动模式或者 allowTaskreparenting 属性配对使用。另外,任务栈分为前台任务栈和后台任务栈,后台任务栈中的 Activity 处于暂停状态,用户可以通过切换将后台任务栈再次调到前台。 适合作为程序入口点,例如浏览器的主界面,不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走 onNewIntent,并且会清空主界面上的其它页面
四、singleInstance – 单实例模式
singleInstance:单实例模式。该模式除了具备 singleTask 模式的所有特性外,该模式的 Activity 只能单独的位于一个任务栈中,具有全局唯一性,即整个系统中只有这一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例
更多Android知识点分享
- 架构师筑基必备技能
目前Android APP开发主流语言就是Java语言,Java语言最大的特性就是提高了软件的交互可能性,可以说安卓手机几乎所有应用程序都是利用Java语言来进行编写的。由于篇幅原因,这里有一份完整学习笔记pdf如有需要,可以点击这里免费自取!
知识要点: 1、深入理解Java泛型 2、注解深入浅出 3、并发编程 4、数据传输与序列化 5、Java虚拟机原理 6、高效IO
- 设计思想解读开源框架
随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑、快速迭代的目的越来越难,插件化技术应用而生。如果没有插件化技术,美团、淘宝这些集成了大量“app”的应用,可能会有几个g那么大。
所以,当今的Android移动开发,不会热修复、插件化、组件化,80%以上的面试都过不了。
知识要点: 1、热修复设计 2、插件化框架设计 3、组件化框架设计 4、图片加载框架 5、网络访问框架设计 6、RXJava响应式编程框架设计
- 360°全方位性能调优
在不同层次的开发工程师手里,因为技术水平的参差不齐,即使很多手机在跑分软件性能非常高,打开应用依然存在卡顿现象。
另外,随着产品内容迭代,功能越来越复杂,UI页面也越来越丰富,也成为流畅运行的一种阻碍。综上所述,对APP进行性能优化已成为开发者该有的一种综合素质,也是开发者能够完成高质量应用程序作品的保证。
1、设计思想与代码质量优化 2、程序性能优化
-
启动速度与执行效率优化
-
布局检测与优化
-
内存优化
-
耗电优化
-
网络传输与数据储存优化
-
APK大小优化
3、开发效率优化
-
分布式版本控制系统Git
-
自动化构建系统Gradle
4、项目实战
-
启动速度
-
流畅度
-
抖音在APK包大小资源优化的实践
-
优酷响应式布局技术全解析
-
网络优化
-
手机淘宝双十一性能优化项目揭秘
-
高德APP全链路源码依赖分析
-
彻底干掉OOM的实战经验分享
-
微信Android终端内存优化实践
- Android框架体系架构
Android框架体系架构(高级UI+FrameWork源码) 这块知识是现今使用者最多的,我们称之Android2013~2016年的技术。
Android开发者也往往因为网上copy代码习惯了而导致对这块经常“使用”的代码熟悉而又陌生:熟悉的是几乎天天在和它们打交道, 天天在复制这些代码 ;陌生的是虽然天天和这些代码打交道,但是并没有深入研究过这些代码的原理,代码深处的内涵。
本篇知识要点: 1、高级UI晋升 2、Android内核组件 3、大型项目必备IPC 4、数据持久与序列化 5、Framework内核解析
- NDK模块开发(音视频系列)
NDK(Native Development Kit缩写)一种基于原生程序接口的软件开发工具包,可以让您在 Android 应用中利用 C 和 C++ 代码的工具。通过此工具开发的程序直接在本地运行,而不是虚拟机。
在Android中,NDK是一系列工具的集合,主要用于扩展Android SDK。NDK提供了一系列的工具可以帮助开发者快速的开发C或C++的动态库,并能自动将so和Java应用一起打包成apk。
本篇知识要点: 1、NDK开发之C/C++入门 2、JNI模块开发 3、Linux编程 4、底层图片处理 5、音视频开发 6、机器学习
- Flutter学习进阶
2019 年无疑是 Flutter 技术如火如荼发展的一年。
每一个移动开发者都在为 Flutter 带来的“快速开发、富有表现力和灵活的 UI、原生性能”的特色和理念而痴狂,从超级 App 到独立应用,从纯 Flutter 到混合栈,开发者们在不同的场景下乐此不疲的探索和应用着 Flutter 技术,也在面临着各种各样不同的挑战。
本篇知识要点: 1、Flutter跨平台开发概述 2、Windows中Flutter开发环境搭建 3、编写你的第一个Flutter APP 4、Flutter Dart语言系统入门 …
- 微信小程序开发
微信小程序作为现在比较火的编程开发应用场景之一,深受市场的青睐,这让不少开发者眼馋不已。但是对于初学者来说,就完全摸不着头脑了,不知道微信小程序开发制作需要学习那些知识,有需要的朋友可以参考本篇。
本篇知识要点: 1、小程序概述及入门 2、小程序UI开发 3、API操作 4、购物商场项目实战
- Android相关源码解读 只要是程序员,不管是Java还是Android,如果不去阅读源码,只看api文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
由于篇幅原因,以上完整学习笔记pdf如有需要,可以点击这里免费自取!
Activity启动模式 launchMode
转载
http://blog.csdn.net/zhangjg_blog/article/details/10923643
singleTop, Activity可能会执行OnNewIntent
singleTask Activity上面的所有Activity将以合适的方式自动销毁, 执行OnNewIntent()
在启动一个singleTask的Activity实例时,如果系统中已经存在这样一个实例,就会将这个实例调度到任务栈的栈顶,并清除它当前所在任务中位于它上面的所有的activity。
以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例
以singleInstance模式启动的Activity具有独占性,即它会独自占用一个任务,被他开启的任何activity都会运行在其他任务中
被singleInstance模式的Activity A在开启另一activity B时,能够开启一个新任务,但是是不是真的开启新任务,还要受其他条件的限制,这个条件是:当前系统中是不是已经有了一个activity B的taskAffinity属性指定的任务。
singleTop适合接收通知启动的内容显示页面。从外界可能多次跳转到一个界面
singleTask适合作为程序入口点
singleInstance适合需要与程序分离开的页面。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
Activity启动模式----LaunchMode
四种启动模式
Standard
标准模式
,每当有一次Intent请求,就会创建一个新的Activity实例。
-
Android 5.0 之前
同一应用内
新生成的Activity,放入发送Intent者Task的栈顶。
TaskRecord{537925a8 #42 A com.zlq.lmt U 0} Run #3: ActivityRecord{538314d0 com.zlq.lmt/.StandardActivity} Run #2: ActivityRecord{5385a7c4 com.zlq.lmt/.StandardActivity} Run #1: ActivityRecord{53760908 com.zlq.lmt/.MainActivity}
跨应用启动
新生成的Activity,放入发送Intent者Task的栈的栈顶(尽管他们属于不同的程序,还是会放入调用者程序的栈内)。
TaskRecord{537df318 #52 A com.zlq.bbb U 0} Run #2: ActivityRecord{537a889c com.zlq.lmt/.StandardActivity} Run #1: ActivityRecord{537a4a5c com.zlq.bbb/.MainActivityB}
这时,我们打开任务管理器(最近任务按钮)。会发现最近任务中现实的应用名为B应用,展示的界面却是A应用的StandardActivity(因为其位于Task栈顶)。
-
Android 5.0 之后
同一应用内
与Android 5.0之前保持一致跨应用启动
经检验与Android5.0之前保持一致。Android6.0上也依然没改变。参考资料深入讲解Android中Activity launchMode
内容或许有误 。
使用场景
standard这种启动模式适合于撰写邮件Activity或者社交网络消息发布Activity。如果你想为每一个intent创建一个Activity处理,那么就是用standard这种模式。
SingleTop
栈顶复用模式
. SingleTop其实和Standard几乎一样,使用SingleTop的Activity也可以创建很多个实例。唯一不同的就是,如果调用的目标Activity已经位于调用者的Task的栈顶,则不创建新实例,而是使用当前的这个Activity实例,并调用这个实例的onNewIntent方法。
在singleTop这种模式下,我们需要处理应用这个模式的Activity的onCreate和onNewIntent两个方法,确保逻辑正常。
TaskRecord{537925a8 #42 A com.zlq.lmt U 0}
Run #4: ActivityRecord{537e3114 com.zlq.lmt/.SingleTopActivity}
Run #3: ActivityRecord{537dfe7c com.zlq.lmt/.StandardActivity}
Run #2: ActivityRecord{53770808 com.zlq.lmt/.SingleTopActivity}
Run #1: ActivityRecord{53760908 com.zlq.lmt/.MainActivity}
栈顶无法像Standard模式一样,同事存在两个,但是整个Task列表中间隔存在多个是可以的。
SingleTask
栈内复用模式
.使用singleTask启动模式的Activity在一个应用Task中只会存在一个实例。如果这个实例已经存在,intent就会通过onNewIntent传递到这个Activity,即多次调用不会创建新实例。否则新的Activity实例被创建。
情况包含以下几种:
同一应用内
任务栈不存在, 初次启动SingleTask实例, 会创建任务栈和实例.
Google在singleTask的文档有这样一段描述:
The system creates a new task and instantiates the activity at the root of the new task.
意思为 系统会创建一个新的Task,并创建Activity实例放入这个新的Task的底部。然而实际并非如此,在我的例子中,singleTask Activity并创建并放入了调用者所在的Task,而不是放入新的Task:
TaskRecord{5378ff88 #44 A com.zlq.lmt U 0}
Run #3: ActivityRecord{537e2ff0 com.zlq.lmt/.SingleTaskActivity}
Run #2: ActivityRecord{537de2ec com.zlq.lmt/.StandardActivity}
Run #1: ActivityRecord{53788be0 com.zlq.lmt/.MainActivity}
怎样才能符合文档中所描述的情况呢?那就是 `taskAffinity`属性和singleTask启动模式配合使用.
<activity
android:name=".SingleTaskWithTaskAffinityActivity"
android:label="SingleTaskWithTaskAffinityActivity"
android:launchMode="singleTask"
android:taskAffinity="com.zlq.new">
</activity>
此时再执行同样的操作,栈内的情况:
TaskRecord{53778428 #45 A com.zlq.new U 0}
Run #3: ActivityRecord{537db410 com.zlq.lmt/.SingleTaskWithTaskAffinityActivity}
TaskRecord{5378ff88 #44 A com.zlq.lmt U 0}
Run #2: ActivityRecord{53760908 com.zlq.lmt/.StandardActivity}
Run #1: ActivityRecord{53788be0 com.zlq.lmt/.MainActivity}
其实,把启动模式设置为singleTask,framework在启动该activity时只会把它标示为可在一个新任务中启动,至于是否在一个新任务中启动,还要受其他条件的限制。使用taskAffinity
属性会指定新的Activity所属栈,可与SingleTask配合使用, 对Standard模式无效.新任务栈是com.zlq.new
.
任务栈存在, 初次启动SingleTask实例, Task栈中不存在singleTask Activity的实例。那么就需要创建这个Activity的实例,并且将这个实例放入和调用者相同的Task中并位于栈顶。与Standard模式相同.
任务栈相同,如果singleTask Activity实例已然存在,再次启动SingleTask实例, 那么在Activity回退栈中,所有位于该Activity上面的Activity实例都将被销毁掉(销毁过程会调用Activity生命周期回调),这样使得singleTask Activity实例位于栈顶(具有clearTop的效果)。与此同时,Intent会通过onNewIntent传递到这个SingleTask Activity实例。 并清除其上面实例, 具有clearTop的效果.最终,singleTask Activity实例会位于栈顶。
任务栈不同, 再次启动SingleTask实例, 会导致任务栈切换, 后台置于前台.
跨应用之间:
任务栈不存在, 初次启动SingleTask实例, 会创建一个新的任务栈,然后创建SingleTask Activity的实例,将其放入新的Task中。Task变化如下。
从
TaskRecord{5bf28 #16 A=com.zlq.bbb U=0 sz=1}
Run #0: ActivityRecord{f4a1b15 u0 com.zlq.bbb/.MainActivityB t16}
变为:
TaskRecord{5c70a93 #17 A=com.zlq.lmt U=0 sz=1}
Run #1: ActivityRecord{4cd8b0f u0 com.zlq.lmt/.SingleTaskActivity t17}
TaskRecord{5bf28 #16 A=com.zlq.bbb U=0 sz=1}
Run #0: ActivityRecord{f4a1b15 u0 com.zlq.bbb/.MainActivityB t16}
最近任务变化:
变为:
任务栈存在, 初次启动SingleTask实例, Task栈中不存在singleTask Activity的实例。
如果singleTask Activity所在的应用进程存在,但是singleTask Activity实例不存在,那么从别的应用启动这个Activity,新的Activity实例会被创建,并放入到所属进程所在的Task中,并位于栈顶位置。
从
Running activities (most recent first):
TaskRecord{5bf28 #16 A=com.zlq.bbb U=0 sz=1}
Run #1: ActivityRecord{f4a1b15 u0 com.zlq.bbb/.MainActivityB t16}
TaskRecord{65dfdf0 #18 A=com.zlq.lmt U=0 sz=1}
Run #0: ActivityRecord{f0eba63 u0 com.zlq.lmt/.MainActivity t18}
↓变为↓:
Running activities (most recent first):
TaskRecord{65dfdf0 #18 A=com.zlq.lmt U=0 sz=2}
Run #2: ActivityRecord{73d091c u0 com.zlq.lmt/.SingleTaskActivity t18}
TaskRecord{5bf28 #16 A=com.zlq.bbb U=0 sz=1}
Run #1: ActivityRecord{f4a1b15 u0 com.zlq.bbb/.MainActivityB t16}
TaskRecord{65dfdf0 #18 A=com.zlq.lmt U=0 sz=2}
Run #0: ActivityRecord{f0eba63 u0 com.zlq.lmt/.MainActivity t18}
如果singleTask Activity实例存在,从其他程序被启动,那么这个Activity所在的Task会被移到顶部,并且在这个Task中,位于singleTask Activity实例之上的所有Activity将会被正常销毁掉。如果我们按返回键,那么我们首先会回退到这个Task中的其他Activity,直到当前Task的Activity回退栈为空时,才会返回到调用者的Task。
从
Running activities (most recent first):
TaskRecord{5bf28 #16 A=com.zlq.bbb U=0 sz=1}
Run #4: ActivityRecord{f4a1b15 u0 com.zlq.bbb/.MainActivityB t16}
TaskRecord{65dfdf0 #18 A=com.zlq.lmt U=0 sz=4}
Run #3: ActivityRecord{fa7aae9 u0 com.zlq.lmt/.StandardActivity t18}
Run #2: ActivityRecord{dfd9a3b u0 com.zlq.lmt/.StandardActivity t18}
Run #1: ActivityRecord{660ce3c u0 com.zlq.lmt/.SingleTaskActivity t18}
Run #0: ActivityRecord{f0eba63 u0 com.zlq.lmt/.MainActivity t18}
↓变为↓:
Running activities (most recent first):
TaskRecord{65dfdf0 #18 A=com.zlq.lmt U=0 sz=2}
Run #2: ActivityRecord{660ce3c u0 com.zlq.lmt/.SingleTaskActivity t18}
TaskRecord{5bf28 #16 A=com.zlq.bbb U=0 sz=1}
Run #1: ActivityRecord{f4a1b15 u0 com.zlq.bbb/.MainActivityB t16}
TaskRecord{65dfdf0 #18 A=com.zlq.lmt U=0 sz=2}
Run #0: ActivityRecord{f0eba63 u0 com.zlq.lmt/.MainActivity t18}
可以看到,TASK ID为#18
的任务栈已经从原来的4
个变为最终的1+1
个。
使用场景:
该模式的使用场景多类似于邮件客户端的收件箱或者社交应用的时间线Activity。上述两种场景需要对应的Activity只保持一个实例即可,但是也要谨慎使用这种模式,因为它可以在用户未感知的情况下销毁掉其他Activity。
SingleInstance
单实例模式
启动时, 系统会为其创造一个单独的任务栈, 以后每次使用, 都会使用这个单例, 直到其被销毁, 属于真正的单例模式.singleTask差不多,唯一不同的就是存放singleInstance Activity实例的Task只能存放一个该模式的Activity实例,不能有任何其他的Activity。
虽然是两个task,但是在系统的任务管理器中,却始终显示一个,即位于顶部的Task中。
相关知识点
查看当前任务栈:
adb shell dumpsys activity | sed -n -e ''/Stack #/p'' -e ''/Running activities/,/Run #0/p''
输出的结果如:
Running activities (most recent first):
TaskRecord{65dfdf0 #18 A=com.zlq.lmt U=0 sz=2}
Run #2: ActivityRecord{660ce3c u0 com.zlq.lmt/.SingleTaskActivity t18}
TaskRecord{5bf28 #16 A=com.zlq.bbb U=0 sz=1}
Run #1: ActivityRecord{f4a1b15 u0 com.zlq.bbb/.MainActivityB t16}
TaskRecord{65dfdf0 #18 A=com.zlq.lmt U=0 sz=2}
Run #0: ActivityRecord{f0eba63 u0 com.zlq.lmt/.MainActivity t18}
拿TaskRecord{65dfdf0 #18 A=com.zlq.lmt U=0 sz=2}
为例
以TaskRecord开头的(如)为一组 TaskRecord记录,#18为Task的ID,A=包名,sz为该Task的Activity数量。
以Run #开头的为一个ActivityRecord记录。其中也包含了包名、类名、TASK ID等信息。
其中以Task ID为一个任务栈的唯一标识,ID相同的TaskRecord属于同一个任务栈(可以理解为同一应用)。
对startActivityForResult的影响:
startActivityForResult 不同于 startActivity, 在使用 startActivityForResult 时不管LaunchMode设置为哪种模式,都会在调用者Task栈中新建实例以正确地返回数据。在栈中的展现形式均与Standard相同(可生成多份连续的实例)。
SingleTop,当其使用startActivityForResult时表现和Standard启动模式时完全相同
SingleTask,当不定义 taskAffinity 属性时使用startActivityForResult和Standard启动模式时表现完全相同。当定义了taskAffinity 属性后,变现将和下面第3条表现一致。
SingleInstance,无法通过startActivity创建自己(无论当前所属哪个栈)。startActivityForResult 随意在当前栈(传入者所在栈)新建实例。
Running activities (most recent first):
TaskRecord{ef9f20b #33 A=com.zlq.lmt U=0 sz=4}
Run #3: ActivityRecord{34f60b1 u0 com.zlq.lmt/.SingleTaskActivity t33} *
Run #2: ActivityRecord{914547d u0 com.zlq.lmt/.SingleTaskActivity t33} *
Run #1: ActivityRecord{a1f3e09 u0 com.zlq.lmt/.SingleTaskActivity t33}
Run #0: ActivityRecord{f7db1c u0 com.zlq.lmt/.MainActivity t33}
上面代码片段中,加了*
标的表示使用startActivity无法建立,是 使用startActivityForResult
建立的Activity。
由此可知, 因为startActivityForResult需要返回值, 会保留实例, 部分覆盖单例效果.
注意: 4.x版本通过startActivityForResult启动singleTask, 无法正常获取返回值, 参考.
5.x以上版本修复此问题, 考虑兼容性, 不推荐使用startActivityForResult和singleTask.
Demo源码
以上均为参考资料和自己实践验证所得结果。有描述不清楚的地方,大家可去下载我的代码自行验证各种情况:GitHub
参考资料链接
深入讲解Android中Activity launchMode
分析 Activity 的启动模式
Android中Activity四种启动模式和taskAffinity属性详解
Activity的launchMode启动模式 day7
Activity的launchMode day7
在功能清单AndroidManifest.xml 里 设置 启动模式
如: <activity android:name=".BActivity" android:launchMode="singleTask"></activity>
1、standard -- 系统的默认启动模式
standard的Activity:
1)可以被实例化多次
2)可以在Task(栈)中的任何位置
3)一个新的Intent请求就会实例化一次
2、singleTop
1) 栈顶刚好有该Activity的实例就会重用该实例 不会创建新的Activity对象
不过会调用onNewIntent()方法 -- 调用该方法的作用?
2)栈顶没有该Activity实例 -- 也和 standard一样 会创建 新的 实例
3)好处在于栈顶有该Activity 实例 就不用 开辟新的内存空间
3、singleTask
1) 栈的任何位置有该Activity的实例 就会重用该实例 -- 会调用实例的onNewIntent()
没有就新创建一个
2) 它并且把该栈上面的实例全部从该栈移除掉
4、singleInstance
1) 每次都会在一个新栈创建该Activity的 实例 -- 也就是TaskId 不同
2)任何运用激活这个Activity 都会重用 该栈中的实例
3)相当于 多个 运用程序 共享一个 运用
Android (Launch Mode) 四种启动模式
1.standard
通过textView.setText(this+""); 根据HashCode(activityId)可判断出每次都创建了新Activity : startActivity(ActivityX.this,ActivityX.class)。
上图中A1、A2、A3是代表ActivityA的三个实例。
2.singleTop
如果栈顶已有要创建的Activity实例,则将intent发送给该实例(hashcode=41e706d0)而不发给新实例。用singleTZ喎�"/kf/ware/vc/" target="_blank">vcMSjyr2/yb3ivvbVu7altuC49tbYuLTP4M2stcRBY3Rpdml0ebXEzsrM4qGjPC9wPgo8cD7J+sP81tzG2qO6PC9wPgo8cD48aW1nIHNyYz0="/uploadfile/Collfiles/20140216/2014021609080661.jpg" alt="\">
注:其中填充为绿色的两个方块是代表同一个Activity实例(activityId相同)。
如果是A-->B-->A,如下:
A:singleTop
B:standard
从B跳到A时,A若不在栈顶则和standard模式效果一样创建一个新A实例。
若是A-->B-->A-->B-->A,这时的运行情况如下:
通过HashCode可以很清楚地知道是一个新实例还是一个已存在的实例。
生命周期(A-->B-->A):
3.singleTask
A:singleTask
B:standard
A-->B-->A-->B:
注:绿色方块是指同一个Activity实例。关于它的生命周期,通过Intent启动一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这时系统不会再调用onCreate来处理请求数据,而是调用onNewIntent方法。
4.singleInstance
A:standard
B:singleInstance
注:一个task就是一个栈,一个栈里可放入多个Activity。taskId=this.getTaskId()。
taskId=1671的栈先回退完,之后再回退taskId=1672的栈。
关于Android四种启动模式LanchMode和android四种启动模式的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Activity启动模式 launchMode、Activity启动模式----LaunchMode、Activity的launchMode启动模式 day7、Android (Launch Mode) 四种启动模式的相关知识,请在本站寻找。
本文标签: