返回栈跨应用时的行为不同
别名: task affinity · 跨应用返回 · Android task · back to referrer
概念解释
从聊天里点一张地图、从邮件里点一个登录页,人已经离开了原来的应用。安卓的任务栈(task / back stack)可以把这次跳转接成一条返回链:在地图里按返回,有机会回到聊天。iOS 把跳转当成应用切换,没有一条系统返回链能跨过应用边界;要回去,靠应用切换器,或偶尔出现的「返回某应用」横条。同样是「打开相机拍完一张」,安卓常把人送回发照片的那条对话,iOS 则把人留在相机里。这条只谈返回链越过应用边界时往哪走,不谈系统级返回在不在,也不谈用同一套按钮去统一两端。
机制
安卓用意图启动另一个活动时,默认把对方放进当前任务,返回就结束对方、露出调用方。任务亲和、启动模式会改这条链:有的应用把自己开成新任务,返回就不再回到调用方,而是落到它自己的根。iOS 的应用是独立的过程,系统返回只在当前应用的导航栈里走;跨应用是一次前台切换,栈不拼接。结果是同一条产品路径——分享、授权、选地址、打开银行——在安卓上被用户当成「还在刚才那件事里」,在 iOS 上被当成「我去了另一个应用」。授权若用系统浏览器完成,安卓的自定义标签页通常把返回接到原应用;iOS 则依赖跳回的 URL,失败时人停在浏览器里,不知道原来的登录还在不在。
怎么研究
做跨应用任务追踪:从应用 A 的一个明确入口打开 B,在 B 里发出该平台的返回或离开,记录落点是 A、B 的根,还是主屏。事后问「你以为会回到哪」。
自变量:平台、B 是否以新任务启动、是否经过系统浏览器或分享面板。 因变量:实际落点、与预期落点是否一致、是否用应用切换器找回 A、重复提交或重复登录的次数。
日志里的「返回」事件在两端不是同一种 API,要对齐的是用户动作而不是函数名。实验室若只在单一应用内点返回,测不到跨应用栈。不要把 iOS 的「返回 Safari」横条当成安卓式的栈——它是一次性入口,不是可连续弹出的链。
边界
分享面板若是系统模态而不是独立应用,返回关闭的是面板,两端都还在原应用里,没有跨应用栈可谈。应用内嵌的网页视图没有离开应用,返回走的是网页历史。同一开发者的应用组在安卓上可能共享任务,表现得像一个应用。iOS 的 Handoff、万能链接失败时的回退,是另一条跨设备或跨应用路径,不是返回栈。
怎么落地
- 安卓上被别的应用调起时,系统返回应回到调用方,而不是清栈落到自己的首页;只有在自己作为独立任务被打开时,才回到自己的根。
- iOS 上在完成跨应用步骤后主动回到原流程(用系统提供的回跳),不要模仿安卓连续弹栈;回跳失败要说明人现在在哪个应用。
- 授权、支付、选图这些必经的他应用步骤,在两端分别画「从哪来、回哪去」的图,不要共用一张流程图。
- 验证:从聊天、邮件、浏览器各走一次「打开你的应用再离开」。安卓连续按返回应能回到出发的那条对话或那封邮件;iOS 应能通过明确回跳或切换器找到出发处,且不在他应用的根页上迷路。任何落到空白首页、要求重新登录的路径都是跨应用栈被剪断。