SystemUI RecentsActivity 分析
功能描述
Android在finish结束应用后,之前占用内存不会立即被释放出来。在内存不足的时候,我们可以recent按钮清理后台的应用。点击recent按钮,界面上会显示所有有界面后台的task的栈顶缩微图(Launch不会显示)
预先了解
ActivityStack,ActivityRecord,TaskRecord关系
- ActivityStack则是用来管理TaskRecord的,包含了多个TaskRecord。
- 一个TaskRecord由一个或者多个ActivityRecord组成,这就是我们常说的任务栈,具有后进先出的特点
- ActivityRecord对应一个Activity实例
下面是包含关系
->:包含
- 问题1:什么情况才会有多个TaskRecord
当跳转的下一个界面的启动模式是 android:launchMode=“singleInstance”,应用会产生新的TaskRecord
可以通过 adb shell dumpsys activity 抓取后台task
当我们设置MainActivity为singleInstance时:
TaskRecord{1175cb4 #59 A=com.can.keycodeddetected U=0 StackId=1 sz=1}
Run #1: ActivityRecord{f3ddef9 u0 com.can.keycodeddetected/.MainActivity t59}
TaskRecord{c6b59bc #58 A=com.can.keycodeddetected U=0 StackId=1 sz=1}
Run #0: ActivityRecord{3c56e71 u0 com.can.keycodeddetected/.autofilltest.AutoFillActivity t58}
当我们设置MainActivity为standard时:
TaskRecord{d0f6fec #60 A=com.can.keycodeddetected U=0 StackId=1 sz=2}
Run #1: ActivityRecord{1ca3948 u0 com.can.keycodeddetected/.MainActivity t60}
Run #0: ActivityRecord{b07d861 u0 com.can.keycodeddetected/.autofilltest.AutoFillActivity t60}
mResumedActivity: ActivityRecord{1ca3948 u0 com.can.keycodeddetected/.MainActivity t60}
从上面可以看出singleInstance模式下,会有两个TaskRecord,分别是#58,#59,在standard就只有一个#60。
- 问题2:(一个应用内)点击recent按钮显示的是哪个TaskRecord,如果清除后台,是清除的TaskRecord还是ActivityStack
通过应用,我们可以发现recent按钮,只会显示最后这个应用的界面(runningtask),当我们清除这个应用后台,整个应用都清除了,所以:点击recent按钮显示的是最后运行的TaskRecord,清除后台,是清除的ActivityStack,因为只有一个taskrecord显示在历史记录,如果是清除的TaskRecord,那么必须显示所有的TaskRecord,这样显然不合理,对于用户