cover
前言

下午在调查其他问题(Monkey工具进行应用间Activity切换压力测试后,为什么在应用A的Activity下按返回键不是返回Home,而是返回上一个应用B的Activity)时,无意中发现Android4.4+一个疑似Bug,故顺便写出来记录一下。

证明

Androidy原生代码的ActivityManage.java代码片段如下:

从注释和变量的命名可以得知,当某个Activity设置了这个Flag时,这个Activity的Task将会被移动到顶部显示,Home的Task也会连同着移到该Activity的Task下面。

在Android4.4之前,只有1个栈。

那么当设置了“MOVETASKWITH_HOME”的Flag后,栈中的Task顺序应该如下:

Activity Task Stack
1 Flaged Task
2 Home
3 TaskA
4 TaskB
…… ……

那么当你按Back键,Task将会退出,Home在Task之下,应该会Resume Home。

在Android4.4之后,变成了多栈,Home单独在一个栈中,其它的应用启动时会创建另外一个栈。那么从Task返回home,就由TaskRecord中的一个成员变量来控制。

Android4.4是一个boolean mOnTopOfHome,见下:

Android5.0是一个int mTaskToReturnTo,见下:

那么当Flaged Task移到顶部时,我觉得应该是:

Activity Task Stack Home Stack
1 Flaged Task
(mOnTopOfHome = true)
Home
2 TaskA
3 TaskB
…… ……


这样当按Back键退出Flaged Task时,发现mOnTopOfHome值为true, 就应该启动Home。

但是Android4.4+原生代码中,确实在findTaskToMoveToFrontLocked()中根据这个flag,将mOnTopOfHome 设成了true。

可是紧接着在将这个Task插入到栈的顶部时(调用方法insertTaskAtTop()),又会判断这个Task是否是从Home启动的,如果不是,又会将mOnTopOfHome 设成了false。

这样当设置了这个Flag的Task移到顶部时,实际的Stack信息是:

Activity Task Stack Home Stack
1 Flaged Task
(mOnTopOfHome = fasle)
Home
2 TaskA
3 TaskB
…… ……

这样当按Back键退出Task时,发现mOnTopOfHome == false, 启动的是Activity Task Stack下面的TaskA,而不是Home。

我觉着这是Google改多栈改出的一个bug,导致flag MOVETASKWITH_HOME 不生效了。

有任何疑问、想法欢迎大家留言探讨!

支付宝扫码打赏 微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章

蔡培培's Picture
蔡培培

精于规划,热爱研究,自我实现者。目前专注于安卓测试架构、测试开发与移动安全。

Guangzhou「广州」 http://androidtest.org