处理任务亲和力
亲和力表明了一个activity"心仪"哪个任务.默认下,属于同一个应用的所有activitie之间具有相同的任务亲和力.所以,默认下,一个应用的所有activitie首选属于同一任务.然而,你可以修改一个activity的默认任务亲和力.定义于不同应用的Activitie可以具有相同的任务亲和力,或者同一应用中的activitie可以分配不同的任务亲和力.
你可以使用<activity>元素的taskAffinity属性来修改一个activity的任务亲和力.taskAffinity属性使用字符串作为值,这个字符串必须与在<manifest>中声明的默认包名不同,因为系统使用包名来标识默认的任务亲和力.
亲和力在以下两种情况起作用:
-
当启动一个activity的intent包含FLAG_ACTIVITY_NEW_TASK标志.
一个新的activity默认是在调用startActivity()的activity所在的任务中安置.然而,如果传给startActivity()的intent包含了FLAG_ACTIVITY_NEW_TASK标志,系统就会查找另一个能安置这个新activity的任务.通常,它会是一个新任务.然而但是,并不是必须这样做.如果有一个已存在的任务具有与新activity相同的亲和力,那么这个activity就被启动并安置到这个已存在的任务中.如果没有这样的任务,才开始一个新的任务.
如果这个标志导致了一个activity在一个新的任务中启动然后用户按下了HOME键离开了这个新任务,那么必须有一些方法使得用户可以重新回到这个任务.一些实体(比如通知管理器)总是在一个另外的任务中启动activity而从不作为自己任务的一部分,于是它总是把FLAG_ACTIVITY_NEW_TASK设置到传给startActivity()的intents中.如果你有一个activity可以被外部实体使用这个标志调用,应小心用户可能用一个独立的方法回到这个启动的任务,比如使用启动图标(任务的根activity有一个CATEGORY_LAUNCHERintent
过滤器).-翻译得挺难受,这句话也就是说,只要使用了相同的亲和力,用户就能回到这个已启动的任务中.
-
当一个activity的allowTaskReparenting属性为"true"时.
在此情况下,activity可以从启动它的任务移动到一个亲和的任务中,当后一个任务来到前台时.
例如,假设一个报告所选城市的天气状况的activity是作为一个旅游应用的一部分.它与同一个应用中的其它activity具有相同的亲和力(默认的application亲合力)并且它被允许重认父母.当你的一个activity启动了这个天气预报activity,它起初是与你的actvity属于同一个任务.然而,当旅游应用的任务进入前台时,天气预报activity就被重新分配到这个任务并在其只显示.
小提示::如果一个.apk文件包含多个从用户角度所认为的"应用",你可能想通过为activity指定属性taskAffinity来使它们连接到不同的"应用".
清空后退栈
如果用户离开了一个任务很长一段时间,系统会清空任务中除了根activity之外的所有其它activity.当用户重新返回这个任务时,只有根activity被恢复.系统之所以这样做,是因为经过一大段时间之后,用户很可能已抛弃掉他们已经做的并且回到任务开始做一些新的事情.
有一些activity属性你可以用来改变这种行为:
-
alwaysRetainTaskState
如果任务的根activity的这个属性被设置为"true",前面所述的默认行为就不会发生.任务保持所有的后退栈中的activity,即使经过很长一段时间.
-
ClearTaskOnLaunch
如果任务的根activity的这个属性被设置为"true",在用户离开任务再回来时,栈中是清空到只剩下根activity.换句话说,它是与alwaysRetainTaskState反着来的.用户回到任务时永远见到的是初始状态,即使只离开了一小会.
-
finishOnTaskLaunch
这个属性很像clearTaskOnLaunch,但是它作用于一个单独的activity,而不是整个任务.它也可以导致任何activity死亡,包含根activity.当它被置为"true"时,activity只在当前会话中存活.如果用户离开然后回来,它就已经不在了.
启动一个task
你可以设置一个activity为一个任务的入口,通过给它一个值为"android.intent.action.MAIN"的intent过滤器"和一个值为"android.intent.category.LAUNCHER"的过滤器.例如:
<activity... >
<intent-filter... >
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
...
</activity>
一个intent这种类型的过滤器导致activity的一个图标和标签被显示于应用启动界面上.使得用户可以启动这个activity并且再次回到这个任务.
这第二个能力是很重要的:用户必须能离开一个任务并且之后还能通过启动器回来.为此,两种使得activity永远在新任务中启动的启动模式:"singleTask"和"singleInstance",应该只在当activity具有ACTION_MAIN和CATEGORY_LAUNCHER过滤器时使用.想像一下,例如,如果没有这些过滤器将会发生什么:一个intent启动一个"singleTask"activity,在一个新的任务中初始化,并且用户在这个任务中忙乎了一些时间.然后用户按下HOME按钮.任务现在被移到后台并且不可见了.因为这个activity不是应用的启动activity,用户就再也没有办法回到这个任务了.
但遇到那些你不希望用户能够回到一个activity的情况时怎么办呢?有办法:设置<activity>元素的finishOnTaskLaunch属性为"true"!
分享到:
相关推荐
一个activity也可以打开同一设备上存在于其它应用的activitie,例如,如果你的应用想要发送一个邮件,你可以定义一个intent来执行一个"send"动作并包含一些数据,比如一个地址和一条信息.另一个应用中的一个叫嚣自己...
Task&BackStack;.mmap
Simple Stack 这是一个简单的backstack实现,它理论上基于Flow 0.9
imsdroid 包含文档和android-ngn-stack,和库文件
The up-to-date, in-depth, complete guide to React Native. Create beautiful mobile apps with JavaScript and React
博文链接:https://baby69yy2000.iteye.com/blog/173051
The benefits of using a full JavaScript stack for web development are undeniable, especially when robust and widely adopted technologies such as React, Node, and Express and are available. Combining ...
多个Backstack导航(导航组件) 到目前为止, 不支持底部导航中最常用的多种后台堆栈管理。 Google已经有一个,该演示了如何处理多个Backstack。 缺点: 无论用户打开的顺序如何,它总是将用户带回到第一个选项...
Android远程Stacktrace:改进 该项目是,它添加了许多重要功能: 可定制的接口,用于处理堆栈跟踪 通过将堆栈跟踪保存到自己的目录而不是应用程序的根文档目录,从而更好地处理文件系统 允许可选的调试日志记录,这...
stack(栈)在android 中的运用:自定义了一个Activity栈管理Activity
stack官方网站: https://docs.haskellstack.org/en/stable/README/ 首先: 在终端下键入下面这条命令: curl -sSL https://get.haskellstack.org/ | sh 出现以下情况: 在终端下输入命令: sudo apt install curl...
Fragment-Back-Stack Fragment Back Stack manager while displaying fragments on single activity and need to maintain on back press Purpose We know that there is activity stack in Android. We don't need ...
Android的NGN堆栈是一个NGN(下一代网络)堆栈为Android2.X(或更高版本) 设备
heap与stack 的区别, 讲解的很详细了 小细节需要把握仔细了
03_Communication Stack详解
Android下各语言加callStack打印信息的示例 包括C语言, C++,Java和Kernel Space。
Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解2:Queue和LinkedList Java集合详解3:Iterator,fail-fast机制与比较器 Java集合详解4:HashMap和HashTable Java集合详解5:深入...