android Activity的Task Affinity lanchMode,retrofit框架

android Activity的Task Affinity lanchMode,retrofit框架,第1张

android Activity的Task Affinity lanchMode,retrofit框架

默认情况下,一个应用程序中的所有activity都有一个affinity–这让它们属于同一个task。然而,每个activity可以通过中的taskAffinity属性设置单独的affinity。不同应用程序中的activity可以共享同一个affinity,同一个应用程序中的不同activity也可以设置成不同的affinity。affinity属性在2种情况下起作用:当启动activity的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记,或当activity的allowTaskReparenting被设置成true。

l FLAG_ACTIVITY_NEW_TASK标记

当传递给startActivity()的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记时,系统会为需要启动的activity寻找与当前activity不同的task。如果要启动的activity的affinity属性与当前所有的task的affinity属性都不相同,系统会新建一个带那个affinity属性的task,并将要启动的activity压到新建的task栈中;否则将activity压入那个affinity属性相同的栈中。

l allowTaskReparenting属性

如果一个activity的allowTaskReparenting属性为true,那么它可以从一个task(TASK1)移到另外一个有相同affinity的task(TASK2)中(TASK2带到前台时)。

如果一个.apk文件从用户角度来看包含了多个“应用程序”,你可能需要对那些activity赋不同的affinity值。

2、运行模式

activity的launchMode属性可以有四种值:

l “standard” (默认)

l “singleTop“

l “singleTask“

l “singleInstance“

这4种模式可以按4种分类来区分,以下假设位于task1中的activity1启动activity2:

模式分类

包容activity2的task

一个activity是否允许有多个实例

activity是否允许有其它activity共存于一个task

对于新的intent,是否总是实例化activity对象

standard

如果不包含FLAG_ACTIVITY_NEW_TASK标记,则activity2放入task1,否则按前面讲述的规则为activity2选择task

可被多次实例化,同一个task的不同的实例可位于不同的task中,每个task也可包含多个实例

允许

是的。当接收到新的intent时,总是会生成新的activity对象。

singleTop

同standard

同standard

允许

已存在的activity对象,如果位于目标task的栈顶,则该activity被重用,如果它不位于栈顶,则会实例化新的activity对象

singleTask

将activity2放到task1栈顶

不能有多个实例。由于该模式下activity总是位于栈顶,所以actvity在同一个设备里至多只有一个实例

允许。singleTask模式的activity总是位于栈底位置。目标activity实例已存在时,如果该实例刚好位于task栈顶,则接收intent,否则到来的intent将会被丢弃,但该可以响应该intent的那个activity所在的task将会被移到前台。

 

singleInstance

同singleTask

同singleTask

不允许与其它activity共存于一个task。如果activity1的运行在该模式下,则activity2一定与activity1位于不同的task

 

对于新到的intent,如果是由新创建的activity对象来接收,则用户可以通过返回键回到之前的activity;如果是由已存在的activity来接收,则用户无法通过返回键返回到接收intent之前的状态。

3、清空栈

当用户长时间离开task(当前task被转移到后台)时,系统会清除task中栈底activity外的所有activity。这样,当用户返回到task时,只留下那个task最初始的activity了。

这是默认的情况,中有些属性可以改变这种行为。

l alwaysRetainTaskState属性

如果栈底activity的这个属性被设置为true,刚刚描述的情况就不会发生。task中的所有activity将被长时间保存。

l clearTaskOnLaunch属性

如果栈底activity的这个属性被设置为true,一旦用户离开task,则task栈中的activity将被清空到只剩下栈底activity。这种情况刚好与alwaysRetainTaskState相反。即使用户只是短暂地离开,task也会返回到初始状态(只剩下栈底acitivty)。

l finishOnTaskLaunch属性

这个属性与clearTaskOnLaunch相似,但它只对单独的activity *** 作,而不是整个task。它可以结束任何activity,包括栈底的activity。当它设置为true时,当前的activity只在当前会话期间作为task的一部分存在,当用户退出activity再返回时,它将不存在。

束任何activity,包括栈底的activity。当它设置为true时,当前的activity只在当前会话期间作为task的一部分存在,当用户退出activity再返回时,它将不存在。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5708505.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存