問題:
Android 10,打開最近任務中的一個應用,雙擊返回鍵,緊接着點擊菜單鍵 或者 快速依次點擊返回鍵 Home鍵 菜單鍵,這個應用都會從最近任務消失掉,又是Google的坑啊
分析:
看過我之前文章的應該有印象,我的三部曲,反覆復現問題,找規律,從中發現關鍵信息,帶着問題看代碼,驗證問題。這次也不例外,本來測試報的問題是,偶現最近任務的應用消失,但是在我的觀察之下,偶現的問題被我用兩種不同的方法,必現了! 當我用紅色的方式必現問題之後,我考慮的是雙擊返回鍵鍵的時候添加個 flag,點擊菜單鍵的時候,判斷兩者之間的時間差,太短的話就不讓彈出最近任務了,但是搞了半天,突然出現了 黃色的必現方法,於是果斷放棄了這個想法。
接下來,我我仔細觀察了現象,果然,又發現了有價值的現象,其實,該應用其有的時候並不會完全消失,只是有個消失的動畫,但是再次進入最近任務列表的時候,他會排在第二個位置。 哦 ,搞了半天只是走了個動畫啊!於是,我就搜了下執行動畫的代碼,最終定位到了這裏。alps/packages/apps/Launcher3/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java
解決:
@Override
public void onTaskRemoved(int taskId) {
if (!mHandleTaskStackChanges) {
return;
}
BackgroundExecutor.get().submit(() -> {
TaskView taskView = getTaskView(taskId);
if (taskView == null) {
return;
}
Handler handler = taskView.getHandler();
if (handler == null) {
return;
}
// TODO: Add callbacks from AM reflecting adding/removing from the recents list, and
// remove all these checks
Task.TaskKey taskKey = taskView.getTask().key;
if (PackageManagerWrapper.getInstance().getActivityInfo(taskKey.getComponent(),
taskKey.userId) == null) {
// The package was uninstalled
handler.post(() ->
dismissTask(taskView, true /* animate */, false /* removeTask */));
} else {
mModel.findTaskWithId(taskKey.id, (key) -> {start
// 把這段註釋掉
/*if (key == null) {
// The task was removed from the recents list
handler.post(() -> dismissTask(taskView, true *//* animate *//*,
false *//* removeTask *//*));
}*/
});
}
});
}
按照Google的說法是// The task was removed from the recents list,這個任務已經從列表中移除了,因此只是做了個移除的動畫,但是呢,從現象來看,其實任務還是在的,註釋之後確實也沒發現有什麼不良影響。
好了,問題已解決,希望能幫到你!