激活和关闭组件
激活组件:
除了Content provider以外,Activity、Service和broadcast都是被叫做Intent的异步message所激活。既然是Intent,又是message,那么自然就有名字(action name)、传出去的数据及其地址(uric)等等杂七杂八的东东。
Activity的激活:把Intent扔给Context.startActivity()或Activity.startActivityForResult()就ok。不同的是,前者是“弯弓没有回头箭”(直接就走到下一个Activity),后者是“回旋镖”(要带回来点儿肉的)。带回来的东东用onActivityResult()看到。
Service的激活:把Intent扔给Context.startService()或Context.bindService()都ok。Service通过onBind()来接收。
Broadcast Receiver:Intent被扔给Context.sendBroadcast()、Context.sendOrderedBroadcast()和Context.sendStickyBroadcast()时会被Broadcast出去,系统会扔给所有感兴趣的家伙。
关闭组件:
Content provider和Broadcast Receiver交给系统去管。
Activity有两种关法:自杀和他杀。自杀很容易,finish()就行。他杀也很容易,finishActivity()就行。当然他杀不是乱杀,Activity.startActivityForResult()的调用者可以杀死被调用者而不犯法。
当然了,系统在这里扮演GOD,她想杀谁就杀谁。当然她也不是动不动就打开杀戒的,粮食(内存)不够了才会动刀
AndroidManifest.xml
Activity、Service和Content provider必须在AndroidManifest.xml中昭告天下(声明),否则不会被显示和运行。app想要的权限也可以通过她告诉系统。
Task和Activity
Task实际上是Activity的instance的Stack,这些Activity不必是同一应用的。Task的参数只能从根Activity传入。根Activity是Task的起始,一般是某个应用的Launcher,但不一定。
Task作为一个整体在前后台切换,也就是说,这些Activity的instance都被绑在了一条船上。用Home键能把当前Task撇到后台。重新点击这个Task的根Activity对应的图标时,Task被切回前台。
人生一成不变多没意思,于是就有了改变的途径。
Affinity
FLAG_ACTIVITY_NEW_TASK:顾名思义,有这个标志的Intent在激活一个Activity的instance时,会查看当前有没有和这个Activity一样的Affinity的Task。有的话就把她加入到那个新家(Task)中,没有就给她建一个家。
allowTaskReparenting:这个与其说是“换老爸”,不如说叫“认祖归宗”。某个Task可以拉来别的Activity的instance来当儿子(放在自己的Stack里)。而当这个instance的老爸跑来时(与此instance有相同Affinity的Task被切换回前台),儿子就跑回老爸那里去了(调回并显示在同Affinity的Task中)。
启动模式
<activity launchMode=“xxx”>四种启动模式:
"standard" (the default mode)
"singleTop"
"singleTask"
"singleInstance"
但是,配合上Intent的属性,就有很多种表现了。
FLAG_ACTIVITY_NEW_TASK | 此Activity多instance | 所属Task多Activity Instance | 是否创建新Activity Instance处理Intent | |
standard | 同Affinity的规定 | √(同一或不同Task) | √ | √ |
singleTop | 同Affinity的规定 | √(同一或不同Task) | √ | 仅目标Activity不在top时 |
singleTask | X(只为某Task的根) | X(唯一) | √ | 目标为根Activity且其上有其他Instance时忽略此Intent |
singleInstance | X(只为某Task的根) | X(唯一) | X | X(总是根Activity Instance处理) |
清理堆栈
Task如果被扔在后台太久了,系统就会认为这个Task已经被人遗忘了,那么除了根Activity instance,其他的都会被杀死。
当然,有传统就有例外。<activity/>有3个属性可以改变被杀的命运。
1、alwaysRetainTaskState:将根Activity的这个属性置为true,则整个Task中所有的instance都可保留。
2、clearTaskOnLaunch:将根Activity的这个属性置为true,则只要一离开这个Task,除了根Activity都立刻清理干净。
3、finishOnTaskLaunch:可对任意Activity。一旦置为true,用户一离开这个Task,对应的instance就消失无踪。
另外Intent也能来删除Task中的Activity instance。当Intent被设置FLAG_ACTIVITY_CLEAR_TOP为true,然后呢,Task里有能处理这个Intent的instance,则这个instance上边的instance都会给清除掉。如果这个Activity是默认的”standard”,连这个instance自己也会被杀掉。
FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK常常合起来用,把Task中的指定Activity露出来。