activity 启动模式_Intent#FLAG_ACTIVITY_CLEAR_TOP 真的会 clear top 吗

748f1abb1e2c09b5cd3b0107679c4ef9.png

一、背景

前段时间处理了一个 App 内草稿丢失的反馈,很多用户反馈连续存了多个草稿之后,草稿箱都只有一个草稿,显然是发生了草稿丢失。从用户反馈的数据来看,反馈用户的系统版本都在 Android 7.0 以下。

经过一段时间的排查,最后发现是草稿被覆盖了,直接原因是:存草稿后拍摄链路页面(录制页、编辑页、发布页)未被关闭,再次进拍摄之后录制页复用(状态也复用了)导致存草稿的时候发生了草稿替换。

那么问题来了,为什么会发生这样的情况呢?这得从我们存草稿那一刻说起。

二、发现问题:为什么 clear top 不生效?

正常来说,存草稿之后我们会关闭拍摄链路的页面,把拍摄链路上的一串 Activity 都关闭掉。从代码中可以看到,我们是使用 Intent#FLAG_ACTIVITY_CLEAR_TOP | Intent#FLAG_ACTIVITY_NEW_TASK 来实现这一目的的:

5033fe47b5c95888719943597754218f.png

逻辑简单明了,就是加个 clear_top 的 flag,然后 setClass 指定跳转到首页,这里的 getPublishContainerActivityClass 返回的是 MainActivity,看起来没什么异常。

试着打了一个包在小米10 Pro 上试一下,存草稿,没有复现问题,回到首页之后按返回,直接退出 App 了,说明拍摄链路的页面被关闭了。万幸,在换了好几台手机之后,终于在一台 Android 5.1 上复现了这个 case,发现存完草稿回到首页如果再按返回键,就回到了发布页,拍摄链路还在。

所以核心问题就是:为什么在这台 Android 5.1 上 clear_top 这个 flag 没生效?

三、提出问题:FLAG_ACTIVITY_CLEAR_TOP 真的会 clear top 吗?

关于 Intent#FLAG_ACTIVITY_CLEAR_TOP,简单地概括一下就是:设置这个 flag 后,如果发现目标 Activity 已经存在,会将目标 Activity 所在的 Task 移到前台,然后 finish 掉目标 Activity 上层的所有 Activity,最后打开目标 Activity。至于如何判断目标 Activity 已经存在了,注释中并没有提到。

8ac14e389bebc9c2d5339f451b0e4f66.png

回到 Aweme 工程。一般情况下,首页、录制页、编辑页、发布页是在同一个任务栈里,从 adb 打印的 activity 堆栈信息也可以看出这一点。

adb shell dumpsys activity activities | grep 'com.zhiliaoapp.musically'

bedb265e010351e3f56ca16d23d8cbbd.png

看了下这几个 Activity 的启动模式,并没发现什么不一样的地方: VideoRecordNewActivity: singleTask VideoPublishEditActivity: standard(default) VideoPublishActivity: singleTask

大胆猜想一下,难道是不同版本的 ROM 对 Intent#FLAG_ACTIVITY_CLEAR_TOP 的处理有差异导致这个 flag 没生效?

四、尝试在 Demo 上复现问题

建了个 Demo 工程,创建了 A, B, C 三个空页面,分别对应首页、拍摄页、发布页,跳转路径是:A --> B --> C --> A。其中 A、B、C 的启动模式分别为 singleTop, singleTask, singleTask,与 App 内的拍摄链路一致。

在线上问题复现的这台 Android 5.1 上测试发现,C 用 clear_top 回到 A 之后,整个栈就清空了,在 A 点返回直接退出 App 了,没有发现任何异常。

陷入沉思,Demo 上没复现,难道是 Aweme 工程里对 Activity 或者 Intent 这块做了骚操作?(盲猜一手)。打印一下复现问题的这台 Android 5.1 的 App 存草稿之后的任务栈,发现了一些不一样的东西:

2929704b49cc624c9d5fb73d99683c2f.png

从上图我们可以看到,任务栈里最底层的竟然是 SplashActivity,那我们的首页呢?MainActivity 哪去了,我们明明是从首页进拍摄然后到发布页的......随便在 MainA

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值