Mr.Smile填坑記——安卓10 Q Google原生問題最近進任務的task消失的bug

問題:

        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,這個任務已經從列表中移除了,因此只是做了個移除的動畫,但是呢,從現象來看,其實任務還是在的,註釋之後確實也沒發現有什麼不良影響。

        好了,問題已解決,希望能幫到你!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章