Android启动参数

来源:互联网 发布:私人淘宝3c认证怎么弄 编辑:程序博客网 时间:2024/06/11 23:32

android:allowTaskReparenting用来标记Activity能否从启动的Task移动到有着affinity的Task(当这个Task进入到前台时)——“true”,表示能移动,“false”,表示它必须呆在启动时呆在的那个Task里。

如果这个特性没有被设定,设定到<application>元素上的allowTaskReparenting特性的值会应用到Activity上。默认值为“false”。
一 般来说,当Activity启动后,它就与启动它的Task关联,并且在那里耗尽它的整个生命周期。当当前的Task不再显示时,你可以使用这个特性来强 制Activity移动到有着affinity的Task中。典型用法是:把一个应用程序的Activity移到另一个应用程序的主Task中。
例 如,如果e-mail中包含一个web页的链接,点击它就会启动一个Activity来显示这个页面。这个Activity是由Browser应用程序定 义的,但是,现在它作为e-mail?Task的一部分。如果它重新宿主到Browser?Task里,当Browser下一次进入到前台时,它就能被看 见,并且,当e-mail?Task再次进入前台时,就看不到它了。
Actvity的affinity是由taskAffinity特性 定义的。Task的affinity是通过读取根Activity的affinity来决定的。因此,根据定义,根Activity总是位于相同 affinity的Task里。由于启动模式为“singleTask”和?“singleInstance”的Activity只能位于Task的底 部,因此,重新宿主只能限于“standard”和“singleTop”模式。
android:alwaysRetainTaskState
用 来标记Activity所在的Task的状态是否总是由系统来保持——“true”,表示总是;“false”,表示在某种情形下允许系统恢复 Task?到它的初始化状态。默认值是“false”。这个特性只针对Task的根Activity有意义;对其它Activity来说,忽略之。
一般来说,特定的情形如当用户从主画面重新选择这个Task时,系统会对这个Task进行清理(从stack中删除位于根Activity之上的所有Activivity)。典型的情况,当用户有一段时间没有访问这个Task时也会这么做,例如30分钟。
然而,当这个特性设为“true”时,用户总是能回到这个Task的最新状态,无论他们是如何启动的。这非常有用,例如,像Browser应用程序,这里有很多的状态(例如多个打开的Tab),用户不想丢失这些状态。
android:clearTaskOnLaunch
用 来标记是否从Task中清除所有的Activity,除了根Activity外(每当从主画面重新启动时)——“true”,表示总是清除至它的 根?Activity,“false”表示不。默认值是“false”。这个特性只对启动一个新的Task的Activity(根Activity)有意 义;对Task中其它的Activity忽略。
当这个值为“true”,每次用户重新启动这个Task时,都会进入到它的根 Activity中,不管这个Task最后在做些什么,也不管用户是使用?BACK还是HOME离开的。当这个值为“false”时,可能会在一些情形下 (参考alwaysRetainTaskState特性)清除Task的?Activity,但不总是。
假设,某人从主画面启动了 Activity?P,并从那里迁移至Activity?Q。接下来用户按下HOME,然后返回Activity?P。一般,用户可能见到的是 Activity?Q,因为它是P的Task中最后工作的内容。然而,如果P设定这个特性为“true”,当用户按下HOME并使这个Task再次进入前 台时,其上的所有的?Activity(在这里是Q)都将被清除。因此,当返回到这个Task时,用户只能看到P。
如果这个特性和allowTaskReparenting都设定为“true”,那些能重新宿主的Activity会移动到共享affinity的Task中;剩下的Activity都将被抛弃,如上所述。
android:finishOnTaskLaunch
用来标记当用户再次启动它的Task(在主画面选择这个Task)时已经存在的Activity实例是否要关闭(结束)——“true”,表示应该关闭,“false”表示不关闭。默认值是“false”。
如果这个特性和allowTaskReparenting都设定为“true”,这个特性胜出。Activity的affinity忽略。这个Activity不会重新宿主,但是会销毁。
android:launchMode
用于指示Activity如何启动。这里有四种模式,与Intent对象中的Activity?Flags(FLAG_ACTIVITY_*变量)共同作用,来决定Activity如何启动来处理Intent。
它们是:
“standard”
“singleTop”
“singleTask”
“singleInstance”
默认模式是“standard”。
这 些模式可以分成两大组别,“standard”和“singleTop”一组,“singleTask”和“singleInstance”一组。具 有?“standard”和“singleTop”启动模式的Activity可以实例化很多次。这些实例可以属于任何Task并且可以位于 Activity?stack的任何位置。
典型的情况是,它们会进入调用startActivity()的Task(除非Intent对象包含?FLAG_ACTIVITY_NEW_TASK标志,在这种情况下会选择一个不同的Task——参考taskAffinity特性)。
相反的,“singleTask”和“singleInstance”只能启动一个Task。对于“singleInstance”的Activity总是位于Activity?stack的底部。对于“singleTask”的Activity,如果它的android:taskAffinity和启动它的acitivity的android:taskAffinity不一样它也总是位于Activity?stack的底部。对于“singleTask”和“singleInstance”的Activity,设备一次只能拥有一个Activity的实例——只有一个这样的Task。
“standard” 和“singleTop”模式只在一种情况下有差别:每次有一个新的启动“standard”Activity的Intent,就会创建一个新的实例来响 应这个Intent。每个实例处理一个Intent。相似的,一个“singleTop”的Activity实例也有可能被创建来处理新的Intent。
然而,如果目标Task已经有一个存在的实例并且位于stack的顶部,那么,这个实例就会接收到这个新的Intent(调用?onNewIntent());不会创建新的实例。
在其他情况下——例如,如果存在的“singleTop”的Activity实例在目标Task中,但不是在stack的顶部,或者它在一个stack的顶部,但不是在目标Task中——新的实例都会被创建并压入stack中。
“singleTask”和“singleInstance”模式也只在两种情况下有差别:“singleTask”Activity允许其它Activity成为它的Task的部分。如果它的android:taskAffinity和启动它的acitivity的android:taskAffinity不一样,它 就总是位于Activity?stack的底部,如果一样,它就不是位于Activity?stack的底部。另外,其它Activity(必须是 “standard”和“singleTop”Activity)可以启动加入到“singleTask”Activity所在的Task中。
“singleInstance”Activity, 换句话说,不允许其它Activity成为它的Task的部分。它是Task中的唯一Activity。如果它启动其它的Activity,java.io.IOException这个 Activity会被放置到另一个task中——好像Intent中包含了?FLAG_ACTIVITY_NEW_TASK标志。
android:noHistory
用于标记当用户从Activity上离开并且它在屏幕上不再可见时Activity是否从Activity?stack中清除并结束(调用finish()方法)——“true”,表示它应该关闭,“false”,表示不需要。默认值是“false”。
“true”值意味着Activity不会留下历史痕迹。因为它不会在Activity?stack的Task中保留,因此,用户不能返回它。
注意1:该Activity会在用户离开时,或在任务管理器再次选择它时销毁。
android:taskAffinity
Activity为Task拥有的一个affinity。拥有相同的affinity的Activity理论上属于相同的Task(在用户的角度是相同的“应用程序”)。Task的affinity是由它的根Activity决定的。
affinity决定两件事情——Activity重新宿主的Task(参考allowTaskReparenting特性)和使用FLAG_ACTIVITY_NEW_TASK标志启动的Activity宿主的Task。
默认情况,一个应用程序中的所有Activity都拥有相同的affinity。也可以设定这个特性来重组它们,甚至可以把不同应用程序中定义的Activity放置到相同的Task中。
为了明确Activity不宿主特定的Task,设定该特性为空的字符串。
如 果这个特性没有设置,Activity将从应用程序的设定那里继承下来(参考<application>元素的taskAffinity特 性)。应用程序默认的affinity的名字是<manifest>元素中设定的package名。
FLAG_ACTIVITY_BROUGHT_TO_FRONT
这个标志一般不是由程序代码设置的,如在launchMode中设置singleTask模式时系统帮你设定。
FLAG_ACTIVITY_CLEAR_TOP
如 果设置,并且这个Activity已经在当前的Task中运行,因此,不再是重新启动一个这个Activity的实例,而是在这个Activity上方的 所有Activity都将关闭,然后这个Intent会作为一个新的Intent投递到老的Activity(现在位于顶端)中。
例如, 假设一个Task中包含这些Activity:A,B,C,D。如果D调用了startActivity(),并且包含一个指向Activity?B的 Intent,那么,C和D都将结束,然后B接收到这个Intent,因此,目前stack的状况是:A,B。
上例中正在运行的Activity?B既可以在onNewIntent()中接收到这个新的Intent,也可以把自己关闭然后重新启动来接收这个Intent。如果它的启动模式声明为?“standard”(默认值),
并 且你没有在这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,那么它将关闭然后重新创建;对于其它的启动模式,或者在这个 Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,都将把这个Intent投递到当前这个实例的onNewIntent()中。
这 个启动模式还可以与FLAG_ACTIVITY_NEW_TASK结合起来使用:用于启动一个Task中的根Activity,它会把那个Task中任何 运行的实例带入前台,然后清除它直到根Activity。这非常有用,例如,当从Notification?Manager处启动一个Activity。
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
如果设置,这将在Task的Activity?stack中设置一个还原点,当Task恢复时,需要清理Activity。也就是说,下一次Task带着?FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记进入前台时(典型的操作是用户在主画面重启它),
这个Activity和它之上的都将关闭,以至于用户不能再返回到它们,但是可以回到之前的Activity。
这在你的程序有分割点的时候很有用。例如,一个e-mail应用程序可能有一个操作是查看一个附件,需要启动图片浏览Activity来显示。这个?Activity应该作为e-mail应用程序Task的一部分,因为这是用户在这个Task中触发的操作。
然而,当用户离开这个Task,然后从主画面选择e-mail?app,我们可能希望回到查看的会话中,但不是查看图片附件,因为这让人困惑。
通过在启动图片浏览时设定这个标志,浏览及其它启动的Activity在下次用户返回到mail程序时都将全部清除。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
如果设置,新的Activity不会在最近启动的Activity的列表中保存。
FLAG_ACTIVITY_FORWARD_RESULT
如果设置,并且这个Intent用于从一个存在的Activity启动一个新的Activity,新的Activity中对前一个Activity的回复将没传送到该Activity。
这种方式下,新的Activity可以调用setResult(int)或setResult?(int?resultCode,?Intent?data),并且这个结果值将发送给那个作为答复目标的Activity。
注意:感觉它和startActivityForResult的功能差不多,但是还是有疑惑。
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
这个标志一般不由应用程序代码设置,如果这个Activity是从历史记录里启动的(常按HOME键),那么,系统会帮你设定。
FLAG_ACTIVITY_MULTIPLE_TASK
不 要使用这个标志,除非你自己实现了应用程序启动器。与FLAG_ACTIVITY_NEW_TASK结合起来使用,可以禁用把已存的Task送入前台的行 为。当设置时,新的Task总是会启动来处理Intent,而不管这是是否已经有一个Task可以处理相同的事情。
由于默认的系统不包含图形Task管理功能,因此,你不应该使用这个标志,除非你提供给用户一种方式可以返回到已经启动的Task。
如果FLAG_ACTIVITY_NEW_TASK标志没有设置,这个标志被忽略。
FLAG_ACTIVITY_NEW_TASK
一个Activity一般通过调用startActivity()启动并加入到Task中。它同调用者一样,进入同一个Task。
然而,如果传递给startActivity()的Intent对象中包含FLAG_ACTIVITY_NEW_TASK时,系统会搜索一个新的Task来容纳新的Activity。
通常,如标志的名字所示,是一个新的Task。然而,并不是必须是。如果已经存在一个Task与新Activity的affinity相同,这个Activity就会加入到那个Task中。如果不是,启动一个新的Task。
如果启动它的acitve和新Activity的affinity相同,那么新Activity的会进入启动它的acitve所在的Task.
FLAG_ACTIVITY_NO_ANIMATION
如果在Intent中设置,并传递给Context.startActivity()的话,这个标志将阻止系统进入下一个Activity时应用?Acitivity迁移动画。
这并不意味着动画将永不运行——如果另一个Activity在启动显示之前,没有指定这个标志,那么,动画将被应用。
这个标志可以很好的用于执行一连串的操作,而动画被看作是更高一级的事件的驱动。
FLAG_ACTIVITY_NO_HISTORY
如果设置,新的Activity将不再历史stack中保留。用户一离开它,这个Activity就关闭了。这也可以通过设置noHistory特性。
注意1:该Activity会在用户离开时,有时要直到离开后再回来时才销毁。但是对于noHistory特性,在任务管理器再次选择它时也会被销毁。
FLAG_ACTIVITY_NO_USER_ACTION
如果设置,作为新启动的Activity进入前台时,这个标志将阻止现在在最前方的Activity因为我们新的Activity要启动而暂停时回调onUserLeaveHint()。
一个Activity可以依赖这个回调(onUserLeaveHint())指明是显式的用户动作引起的Activity移出后台。
这个回调在Activity的生命周期中标记一个合适的点,并关闭一些Notification。
如果一个Activity是通过非用户驱动的事件启动,如来电或闹钟,启动的,这个标志也应该传递给Context.startActivity,
这样保证暂停的Activity不认为用户已经知晓其Notification。
注意1:如果一个Activity通过非用户驱动的事件,如来电或闹钟,启动的,这个标志也应该传递给Context.startActivity。
注意2:关于onUserLeaveHint的内容请参照附1.
FLAG_ACTIVITY_PREVIOUS_IS_TOP
If?set?and?this?intent?is?being?used?to?launch?a?new?activity?from?an?existing?one,
the?current?activity?will?not?be?counted?as?the?top?activity?for?deciding?whether?the?new?intent?should?be?delivered?to?the?top?instead?of?starting?a?new?one.
The?previous?activity?will?be?used?as?the?top,?with?the?assumption?being?that?the?current?activity?will?finish?itself?immediately.
注意1:不太明白
FLAG_ACTIVITY_REORDER_TO_FRONT
如果在Intent中设置,并传递给Context.startActivity(),这个标志将引发已经运行的Activity移动到历史stack的顶端。
例如,假设一个Task由四个Activity组成:A,B,C,D。如果D调用startActivity()来启动Activity?B,那么,B会移动到历史stack的顶端,现在的次序变成A,C,D,B。
如果FLAG_ACTIVITY_CLEAR_TOP标志也设置的话,那么这个标志将被忽略。
注意1:不太明白
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
If?set,?and?this?activity?is?either?being?started?in?a?new?task?or?bringing?to?the?top?an?existing?task,
then?it?will?be?launched?as?the?front?door?of?the?task.?This?will?result?in?the?application?of?any?affinities?needed?to?have?that?task?in?the?proper?state?(either?moving?activities?to?or?from?it),
or?simply?resetting?that?task?to?its?initial?state?if?needed.
注意1:不太明白
FLAG_ACTIVITY_SINGLE_TOP
如果设置,当这个Activity位于历史stack的顶端运行时,不再启动一个新的。
附1
protected?void?onUserLeaveHint ()
Since:?API?Level?3
Called?as?part?of?the?activity?lifecycle?when?an?activity?is?about?to?go?into?the?background?as?the?result?of?user?choice.
For?example,?when?the?user?presses?the?Home?key,?onUserLeaveHint()?will?be?called,?but?when?an?incoming?phone?call?causes?the?in-call?Activity?to?be?automatically?brought?to?the?foreground,
onUserLeaveHint()?will?not?be?called?on?the?activity?being?interrupted.
In?cases?when?it?is?invoked,?this?method?is?called?right?before?the?activity’s?onPause()?callback.
This?callback?and?onUserInteraction()?are?intended?to?help?activities?manage?status?bar?notifications?intelligently;
specifically,?for?helping?activities?determine?the?proper?time?to?cancel?a?notfication.
作为activity周期的一部分,它在activity因为用户要跳转到别的activity而要退到background时使用。
比如,在用户按下Home键(用户的choice),它将被调用。比如有电话进来(不属于用户的choice),它就不会被调用。
那么系统如何区分让当前activity退到background时使用是用户的choice?
它是根据促使当前activity退到background的那个新启动的Activity的Intent里是否有FLAG_ACTIVITY_NO_USER_ACTION来确定的
注意:通过调用finish()使该activity销毁时不会调用该函数。
原创粉丝点击