- standard: 每次启动都会创建
- singleTop:跟 Standard 类似,当Activity在栈顶时复用
- singleTask:一个栈只保持一个实例,并且会在重新启动Activity时清掉栈顶其它Activity
- singleInstance: 独占一个任务栈
singleTask与singleInstance可以保证一个主Activity,但这两模式存在一个问题:从主Activity跳到子Activity后,按home键回要主桌面,再从桌面应用图标启动应用,会发现重新回到了主Activity。
解决方法:
Intent intent =
new
Intent(
mContext
, MainActivity.
class
);
intent.setFlags(Intent.
FLAG_ACTIVITY_CLEAR_TOP
| Intent.
FLAG_ACTIVITY_SINGLE_TOP
);
startActivity(intent);
启动 Activity A
的请求在intent
中定义优先于在manifest
中定义.
singleTop
FLAG_ACTIVITY_SINGLE_TOP
如果在栈顶就复用,否则就新建。
如果一个activity
的实例已经存在于当前任务的栈的顶端,系统通过调用它的onNewIntent()
方法把intent
路由到这个实例,而不是创建一个新的实例.activity
可以被多次实例化,每个实例可以属于不同的任务,并且一个任务可以具有多个实例(
但只是当位于后退栈的顶端的activity
不存在时才会出现这种现像)
.
"singleTask"
FLAG_ACTIVITY_CLEAR_TOP
如果栈里有,就弹出它上面所有的
Activity
,让它显示出来
不同于
Intent.
FLAG_ACTIVITY_NEW_TASK
;
1.
设置了
"singleTask"
启动模式的
Activity
,它在启动的时候,会先在系统中查找属性值
affinity
等于它的属性值
taskAffinity
的任务存在;如果存在这样的任务,它就会在这个任务中启动,否则就会在新任务中启动。因此,如果我们想要设置了
"singleTask"
启动模式的
Activity
在新的任务中启动,就要为它设置一个独立的
taskAffinity
属性值。
并且接下来启动的
Activity
都和它在同一个
task
中
.
2.
如果设置了
"singleTask"
启动模式的
Activity
不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的
Activity
实例,如果存在,就会把位于这个
Activity
实例上面的
Activity
全部结束掉,即最终这个
Activity
实例会位于任务的堆栈顶端中。
"singleInstance".
独自占用一个栈
跟"singleTask"
一样.除了系统不能再启动其它activity
到拥有这个activity
实例的任务中.activity
永远是任务的唯一;任何由这个activity
启动的其它activity
都在另一个任务中打开.
如果
android:process
属性的值以
":"
开头,则表示这个进程是私有的;如果
android:process
属性的值以小写字母开头,则表示这是一个全局进程,允许其它应用程序组件也在这个进程中运行。必须保证这个属性
字符串内至少有一个
"."
字符
广播机制却是不可替代的,它和
Binder
机制不一样的地方在于,广播的发送者和接收者事先是不需要知道对方的存在的,这样带来的好处便是,系统的各个组件可以松耦合地组织在一起,这样系统就具有高度的可扩展性,容易与其它系统进行集成。