Android Task Affinity说明


Answers:


160

Android Task Affinity有什么用?

一个android应用程序具有“活动”,这些活动像一副纸牌一样形成堆栈。如果您启动一个android应用程序,并启动五个活动A,B,C,D,E。他们将形成一个堆栈

E   - chat view
D   - weather screen
C   - map view
B   - weather screen
A   - login screen

E是最后一个要启动的活动,它正在显示。如果关闭E,将显示D。如果关闭D,将显示C。等等

请注意,活动BD是相同的活动。如果用户要对进行一些修改D weather screen,然后决定关闭活动,然后关闭,该C Map view怎么办?

然后,用户将回到天气屏幕,并且用户将不满意,因为在级别D weather screen上所做的更改未保存在级别中B weather screen。尽管这是同一活动,但它是该活动的不同状态。

用户有一个5层活动堆栈,其中两个是相同的活动。从堆栈中弹出所有5个将创建一种现象,在该现象中您将与同一活动的两个不同版本进行交互,并且可能会造成混乱。

用户通常不会考虑严格的活动堆栈。他们认为:“哦,天气视图,我将在此处进行更改”,然后,他们想回到“地图”视图。然后再次备份,因为他们想返回“登录”屏幕。为什么B weather app显示,为什么不从关卡保存设置D

如果“活动” B和“ 活动D状态”处于链接状态,则程序员可以减轻一些混乱。这样一来改变就改变了另一。每次用户打开新的天气屏幕时,它都会秘密打开天气屏幕的单个实例。

在这种情况下,可能需要更改Activity的taskAffinity。用户将更改级别D。然后回到级别B。然后查看B中对D所做的更改。

该程序保留一个可以备份的堆栈,这很好,当用户在随机位置打开同一活动的X个实例时,它们都是一个。

带有更多说明的幻灯片:http : //www.slideshare.net/RanNachmany/manipulating-android-tasks-and-back-stack


13
如果使用singleInstance而不是使用taskAffinity怎么样?
hguser

5
在上述情况下,我希望在调用Activity D的Intent中将Intent.FLAG_ACTIVITY_REORDER_TO_FRONT作为标志使用,这会将Activity B置于所有其他事件的顶部,并仅保留其中一个实例
EyalBellisha

63
其实,这个答案几乎触及taskAffinity所有:-(的解释是模糊的惊人的论断答案得到这么多的upvotes。
大卫·瓦瑟

5
这么长的答案,但仍然没有提到一个简单的事实:taskAffinity用于指定活动希望在Intent其中运行的任务的名称。当包含标记时FLAG_ACTIVITY_NEW_TASK,活动将被放入此特定任务(由定义taskAffinity)。
Stan Mots

2
Although it's the same activity, it's a different STATE of that activity.我会说:“这是该活动的另一个实例。”
Maksim Dmitriev


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.