在android里,有四种activity的启动模式 分别为:standard singleTop singleTask SingleInstance

1:如何决定所属的task

standard 和 singleTop 的activity 的目标task和收到的Intent 的发送者在同一个task内,除非intent包括参数FLAG_ACTIVITY_NEW_TASK

如果提供了FLAG_ACTIVITY_NEW_TASK 参数会启动到别的task里

http://marshal.easymorse.com/archives/2950

standard 模式:

首先说,standard 模式 也就是默认模式,不需要配置launchMode 先只写一个名

可以多点几次。发现每次都创建了该Activity的新实例。standard的加载模式就是这样的,intent将发送给新的实例。


singleTop

singleTop 和standard 模式,都会将intent发送到新的实例,(后两种模式不发送到新的实例,如果已经发送了的话),不过singleTop 要求如果创建intent的时候栈顶已经有

要创建的activity的实例,,则将intent发送给该实例,而不发送给新的实例


还是用刚才的实例 而不发送给新的实例


singleTask

singleTask 模式和后面的singleInstance 模式都只是创建一个实例的

当Intent 到来,需要创建singleTask 模式的Activity的时候,系统会检查栈里面是否已经有该Activity的实例,如果有直接将intent发送给它


singleIntance

解释singleInsance 模式比较麻烦

首先要说一个Task的概念:

如果是Swing或者Windows 程序,可能有多个窗口可以切换,但是你无法在自己程序中复用人家的窗口,注意是直接复用人家的二进制代码,不是你拿人家的api后的源代码级调用


android可以做到,让别人的程序直接复用你的activity(类似于桌面程序)

android为提供这种机制,就引入Task的概念

Task 可以认为是一个栈,可放入多个Actiity ,比如启动一个应用,那么android就创建一个Task,然后启动这个应用的入口activity,


有这样的需求,多个Task共享一个Activity (singleTask 是在一个task中共享一个activity)




  • 如果是这种情况,多个task栈也可以看作一个应用。比如导游应用启动地图Activity,实际上是在导游应用task栈之上singleInstance模式创建的(如果还没有的话,如果有就是直接显示它)一个新栈,当这个栈里面的唯一Activity,地图Activity回退的时候,只是把这个栈移开了,这样就看到导游应用刚才的Activity了;
  • 多个应用(Task)共享一个Activity要求这些应用都没有退出,比如刚才强调要用home键从导游应用切换到地图应用。因为,如果退出导游应用,而这时也地图应用并未运行的话,那个单独的地图Activity(task)也会退出了。

2. 是否允许多个实例

“standard”和”singleTop”可以被实例化多次,并且存在于不同的task中,且一个task可以包括一个activity的多个实例;

“singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。

singleTop要求如果创建intent的时候栈顶已经有要创建 的Activity的实例,则将intent发送给该实例,而不发送给新的实例。

3. 是否允许其它activity存在于本task内

“singleInstance”独占一个task,其它activity不能存在那个task里;如果它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。

而另外三种模式,则可以和其它activity共存。

4. 是否每次都生成新实例

“standard”对于没一个启动Intent都会生成一个activity的新实例;

“singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。

比如现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。

如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D

如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。

“singleInstance”是其所在栈的唯一activity,它会每次都被重用。

“singleTask”如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。

当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法

如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。

该文来自网络,源地址已经忘了, 原作者可以与我联系,以注明版权!

总结:

standard 每次都会新建,每个Task都可以有,且每个Task都可以有多个实例(每个Task都可以有,且可以有多个)
singleTop 当前实例如果在栈顶,就不新建实例,调用其OnNewIntent。 如不在栈顶,则新建实例(每个Task都可以有,且可以有多个,在栈顶时可复用)
singleTask 新建一个Task,如果已经有其他的Task并且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)
singleInstance 新建一个Task,且在该Task中只有它的唯一一个实例。 (只有一个Task会有,且该Task中只有它)


FLAG_ACTIVITY_NEW_TASK 类似singleTask
FLAG_ACTIVITY_SINGLE_TOP 类似singleTop
FLAG_ACTIVITY_CLEAR_TOP 无对应





配两个图,我觉得很清晰:

(1)standard

android 启动模式之分析_第1张图片


(2)singleTask

android 启动模式之分析_第2张图片

可以将TaskA TaskB理解为两个应用,比如TaskA是你当前的应用,TaskB是默认浏览器。

当到了TaskB中后,按返回键,需要先在TaskB中返回到root,然后才能返回到TaskA。



总结成以下几句

[plain] view plain copy print ?
  1. standard每次都会新建,每个Task都可以有,且每个Task都可以有多个实例(每个Task都可以有,且可以有多个)
  2. singleTop当前实例如果在栈顶,就不新建实例,调用其OnNewIntent。如不在栈顶,则新建实例(每个Task都可以有,且可以有多个,在栈顶时可复用)
  3. singleTask新建一个Task,如果已经有其他的Task并且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)
  4. singleInstance新建一个Task,且在该Task中只有它的唯一一个实例。(只有一个Task会有,且该Task中只有它)



更多相关文章

  1. Android WebView 实例
  2. s003android逆向安全初级篇之apk smali语法之实例分析
  3. MenuItemCompat.getActionProvider 返回实例为空的解决
  4. Android - 开发实例(14):透明SystemBar
  5. Activity的启动模式(android:launchMode)
  6. Android反射机制实例
  7. Android语音识别的具体实现实例
  8. Android Activity加入半透明蒙板,实现夜间模式
  9. Android、Java单例看这里(常用的单例模式对比)

随机推荐

  1. Android 触屏播放音效与释放
  2. Android(安卓)中 View 炸裂特效的实现分
  3. android 调用camera相关操作
  4. android 添加menu 菜单项
  5. Android optionsmenu例程
  6. Android 实现上下滚动TextSwitcher
  7. Android The style on this component re
  8. Android zip文件压缩
  9. Android虚拟sdcard
  10. [APP] Android 开发笔记 001-环境搭建与