Chrisの梳羽之礁

A look of quick intelligence and soft refinement
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Android学习之三——飞来飞去的Activity

Posted on 2010-10-15 17:21  Chrisfang6  阅读(356)  评论(0编辑  收藏  举报

激活和关闭组件

 

激活组件

 

除了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_TOPFLAG_ACTIVITY_NEW_TASK常常合起来用,把Task中的指定Activity露出来。