应用通常包含多个Activity,每个Activity均应围绕用户 可以执行的特定操作 设计,并且能够启动其他Activity。
一个 Activity 甚至可以启动设备上其他应用中存在的 Activity。
问题来了。Activity在哪里加载?Activity怎么启动其他的Activity?启动的过程中有什么加载模式?
官方文档会有很详细的介绍。在这里,不妨看看这个思路来理解。
在哪里加载
Android中是使用Task(来管理活动的)。任务是指在执行特定作业时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈(即返回栈)中。
通俗点来说,一个任务就是一组存放在栈里的Activity(活动)的集合,这个栈就是返回栈(BackStack)。
栈是一种先进先出的数据结构。
怎么启动
Activity之间通过intent来进行通信。
加载模式
在AndroidManifest.xml中,通过给<activity>标签制定android:launchMode属性来选择启动模式。
启动模式一共有四种:standard、singleTop、singleTask、singleInstance四种模式
- standard: 默认。
系统在启动 Activity 的任务中创建 Activity 的新实例并向其传送 Intent。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例。
在这种模式下,每启动一个新的活动,它就会在返回栈中入栈,并处于栈顶位置。系统不管这个活动是否存在返回栈中,每次启动就会创建该活动的一个新的实例。
- singleTop
- 在这种模式下启动活动时,如果发现返回栈的栈顶已经是该活动,则可以直接使用它,不会再创建该活动的实例。
- singleTask
- 在这种模式下启动活动时,系统会首先在返回栈中,检查是否存在该活动的实例,如果发现已经存在,则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现。就会船舰一个新的活动实例。
- singleInstance
- 在这种模式下启动活动时,会有一个单独返回栈来管理这个活动。不管是哪个应用来访问这个活动,都共用同一个返回栈。
适用场景
standard:
这个基本不用说啦,其实大多数的时候都用它,我以前都是用intent各种跳转,跳转的时候把activity给finish()了,然后回退栈的时候在进行跳转 在finish() 这个好累呀。但作为菜鸟的我这样了很久。
singleTop:
1.适合接收通知启动的内容显示页面。
- 比如新闻客户端收到了100个推送,你每次点一下推送他都会走一遍某个activiy(显示新闻只用一个activity,只是内容不同而已)的oncreate,onstart,代价就是创建了那么多的activity(不要以为只有推送,比如qq消息提醒)
a 耗内存
b, 走了100次的跳转动画 ,也是醉了。遇到app相互调用的时候很少用singletop。
2.某些业务需求是自己的activity跳转到自己的。
- 比如 歌曲搜索 你又不会用actionbar,toolbar,那就在activity上面弄个假的呗,搜索完了自己跳转自己现实搜索结果,那就直接用该模式,变化都在onNewIntent()里面对空间进行 赋值之类的。而且也没有跳转动画,人们以为这个activity没有动了,多high。
Intent.FLAG_ACTIVITY_SINGLE_TOP 至于这个问题 它的作用等于singletop,他就管一次,除了activity自己跳转自己,还没想过哪里用,因为两个进程之间跳转 是不走onNewIntent()的。
singleTask:
(我记得第一次面试问的就是开100个activity如何快速关闭)
- 适合程序开始的activity(频繁使用的主架构) 可以用于主架构的activity,(什么新闻啊,侧滑啊)里面有好多fragment,他一般不会被销毁,他可以跳转其他的activity 再回主架构 其他的就销毁呗
- 浏览器的主界面。
不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。(忘了从哪看得了) 比如登陆页面也是 入口 那就没太大必要,因为不经常用啊。finish()算了
那么问题来了 如果你担心主架构用singleTask以后是否会有问题,那又想一下子删除好多activity,那就这样两个一起来 Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK 清除其他的activity而且只管一次 单独用的话我就没 实现过他说的功能 感觉比较坑,一起用最稳。
singleInstance :
他只做一件事情 他的任务栈好复杂呀,我的理解 他只做一件事情就够了 比如 闹钟里面 负责响的页面,打电话 接通的时候,地图显示的时候,他们都有一个特点 就是你做完这件事了都会返回到上一界面 而没有下一界面。 最好不要把 singleInstance 放到 中间的activity里面 a->b->c 如果 b是该启动模式, 那么 a ,c在一个栈里面 b 在一个栈里面,那你如果回退的话就悲剧啦,用户也会感觉奇怪。所以我理解 最好不要 让singleInstance 跳转到其他activity,当然也不绝对。
注意:如果你每次都在oncreate()加载数据 (有变化的都算)那就没法用啦, 或者加载数据的地方在oncreate()和onNewIntent()全写一遍。因为你在后台的话很可能被杀死啦,那你预计让他走onNewIntent() 可能他就走了onCreate()了。