![748f1abb1e2c09b5cd3b0107679c4ef9.png](https://i-blog.csdnimg.cn/blog_migrate/0bb393297ebb30ecd238ef5e70f1cee3.jpeg)
一、背景
前段时间处理了一个 App 内草稿丢失的反馈,很多用户反馈连续存了多个草稿之后,草稿箱都只有一个草稿,显然是发生了草稿丢失。从用户反馈的数据来看,反馈用户的系统版本都在 Android 7.0 以下。
经过一段时间的排查,最后发现是草稿被覆盖了,直接原因是:存草稿后拍摄链路页面(录制页、编辑页、发布页)未被关闭,再次进拍摄之后录制页复用(状态也复用了)导致存草稿的时候发生了草稿替换。
那么问题来了,为什么会发生这样的情况呢?这得从我们存草稿那一刻说起。
二、发现问题:为什么 clear top 不生效?
正常来说,存草稿之后我们会关闭拍摄链路的页面,把拍摄链路上的一串 Activity 都关闭掉。从代码中可以看到,我们是使用 Intent#FLAG_ACTIVITY_CLEAR_TOP | Intent#FLAG_ACTIVITY_NEW_TASK
来实现这一目的的:
![5033fe47b5c95888719943597754218f.png](https://i-blog.csdnimg.cn/blog_migrate/9bc3abed740eb3fa7d81a8173b412b41.jpeg)
逻辑简单明了,就是加个 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](https://i-blog.csdnimg.cn/blog_migrate/fedef5d314f394c1cdc11c2f7215a28f.jpeg)
回到 Aweme 工程。一般情况下,首页、录制页、编辑页、发布页是在同一个任务栈里,从 adb 打印的 activity 堆栈信息也可以看出这一点。
adb shell dumpsys activity activities | grep 'com.zhiliaoapp.musically'
![bedb265e010351e3f56ca16d23d8cbbd.png](https://i-blog.csdnimg.cn/blog_migrate/f8657f669d2f2dc86fd5843ff5c932b9.jpeg)
看了下这几个 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](https://i-blog.csdnimg.cn/blog_migrate/14a47a354597a132a2bb7f06415eb315.jpeg)
从上图我们可以看到,任务栈里最底层的竟然是 SplashActivity,那我们的首页呢?MainActivity 哪去了,我们明明是从首页进拍摄然后到发布页的......随便在 MainA