文化传媒有限公司网站建设,福步外贸论坛怎样注册,phpstudy做网站运营的坏处,代刷推广网站什么是Affinity 在某些情况下#xff0c;Android需要知道一个Activity属于哪个Task#xff0c;即使它没有被启动到一个具体的Task里。这是通过任务共用性#xff08;Affinities#xff09;完成的。任务共用性#xff08;Affinities#xff09;为这个运行一个或多… 什么是Affinity 在某些情况下Android需要知道一个Activity属于哪个Task即使它没有被启动到一个具体的Task里。这是通过任务共用性Affinities完成的。任务共用性Affinities为这个运行一个或多个Activity的Task提供了一个独特的静态名称默认的一个活动的任务共用性Affinity是实现了该Activity的.apk包的名字。 当开始一个没有Intent.FLAG_ACTIVITY_NEW_TASK标志的Activity时任务共用性affinities不会影响将会运行该新活动的Task:它总是运行在启动它的Task里。但是如果使用了NEW_TASK标志那么共用性affinity将被用来判断是否已经存在一个有相同共用性affinity的Task。如果是这样这项Task将被切换到前面而新的Activity会启动于这个Task的顶层。 这种特性在您必须使用NEW_TASK标志的情况下最有用尤其是从状态栏通知或桌面快捷方式启动活动时。结果是当用户用这种方式启动您的应用程序时它的当前Task将被切换到前台而且想要查看的Activity被放在最上面。 你可以在程序清单Manifest文件的应用程序application标签中为.apk包中所有的活动分配你自己的任务共用性Affinites或者在活动标记中为各个活动进行分配。 一些说明其如何使用的例子如下
如果您的.apk包含多个用户可以启动的高层应用程序那么您可能需要对用户看到的每个Activity(活动)指定不同的affinities。一个不错的命名惯例是以附加一个以冒号分隔的字符串来扩展您的.apk包名。例如“ com.android.contacts ”.apk可以有affinities:“com.android.contactsDialer”和“ com.android.contactsContactsList”。如果您正在替换一个通知快捷方式或其他可以从外部发起的应用程序的“内部”活动你可能需要明确设定您替代活动的taskAffinity和您准备替代的应用程序一样。例如如果您想替换contacts详细信息视图用户可以创建并调用快捷方式你得把taskAffinity设置成“com.android.contacts”。 跟 Task 有关的 manifest文件中Activity的特性值介绍 android:allowTaskReparenting 用来标记Activity能否从启动的Task移动到有着affinity的Task当这个Task进入到前台时 “true”表示能移动“false”表示它必须呆在启动时呆在的那个Task里。 如果这个特性没有被设定设定到application元素上的allowTaskReparenting特性的值会应用到Activity上。默认值为“false”。 一般来说当Activity启动后它就与启动它的Task关联并且在那里耗尽它的整个生命周期。当当前的Task不再显示时你可以使用这个特性来强制Activity移动到有着affinity的Task中。典型用法是把一个应用程序的Activity移到另一个应用程序的主Task中。 例如如果 email中包含一个web页的链接点击它就会启动一个Activity来显示这个页面。这个Activity是由Browser应用程序定义的但是现在它作为email Task的一部分。如果它重新宿主到Browser Task里当Browser下一次进入到前台时它就能被看见并且当email 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不会重新宿主但是会销毁。 跟 Task 有关的 Intent对象中设置的Flag FLAG_ACTIVITY_BROUGHT_TO_FRONT 这个标志一般不是由程序代码设置的如在launchMode中设置singleTask模式时系统帮你设定。 FLAG_ACTIVITY_CLEAR_TOP 如果设置并且这个Activity已经在当前的Task中运行因此不再是重新启动一个这个Activity的实例而是在这个Activity上方的所有Activity都将关闭然后这个Intent会作为一个新的Intent投递到老的Activity现在位于顶端中。 例如假设一个Task中包含这些ActivityABCD。如果D调用了startActivity()并且包含一个指向Activity B的Intent那么C和D都将结束然后B接收到这个Intent因此目前stack的状况是AB。 上例中正在运行的Activity B既可以在onNewIntent()中接收到这个新的Intent也可以把自己关闭然后重新启动来接收这个Intent。如果它的启动模式声明为“multiple”(默认值)并且你没有在这个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可以调用setResult(int)并且这个结果值将发送给那个作为答复目标的Activity。 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会成为历史stack中一个新Task的开始。一个Task从启动它的Activity到下一个Task中的Activity定义了用户可以迁移的Activity原子组。Task可以移动到前台和后台在某个特定Task中的所有Activity总是保持相同的次序。 这个标志一般用于呈现“启动”类型的行为它们提供用户一系列可以单独完成的事情与启动它们的Activity完全无关。 使用这个标志如果正在启动的Activity的Task已经在运行的话那么新的Activity将不会启动代替的当前Task会简单的移入前台。参考FLAG_ACTIVITY_MULTIPLE_TASK标志可以禁用这一行为。 这个标志不能用于调用方对已经启动的Activity请求结果。 FLAG_ACTIVITY_NO_ANIMATION 如果在Intent中设置并传递给Context.startActivity()的话这个标志将阻止系统进入下一个Activity时应用Acitivity迁移动画。这并不意味着动画将永不运行——如果另一个Activity在启动显示之前没有指定这个标志那么动画将被应用。这个标志可以很好的用于执行一连串的操作而动画被看作是更高一级的事件的驱动。 FLAG_ACTIVITY_NO_HISTORY 如果设置新的Activity将不再历史stack中保留。用户一离开它这个Activity就关闭了。这也可以通过设置noHistory特性。 FLAG_ACTIVITY_NO_USER_ACTION 如果设置作为新启动的Activity进入前台时这个标志将在Activity暂停之前阻止从最前方的Activity回调的onUserLeaveHint()。 典型的一个Activity可以依赖这个回调指明显式的用户动作引起的Activity移出后台。这个回调在Activity的生命周期中标记一个合适的点并关闭一些Notification。 如果一个Activity通过非用户驱动的事件如来电或闹钟启动的这个标志也应该传递给Context.startActivity保证暂停的Activity不认为用户已经知晓其Notification。 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标志也设置的话那么这个标志将被忽略。 FLAG_ACTIVITY_SINGLE_TOP 如果设置当这个Activity位于历史stack的顶端运行时不再启动一个新的。