記一次從SingleInstance開啟APP無反應問題解決辦法
問題描述:
專案有個需求,當收到推送的時候,應用彈出一個彈框,點選彈框可以跳轉至APP內相應的頁面檢視詳細資訊。當APP已經是開啟狀態的時候,收到訊息,彈出彈框,點選並且跳轉,這沒有什麼問題。問題出現在,當APP已經退出了,這時候再收到訊息,可以彈出彈框,點選彈框依舊可以跳轉,這裡我們做了處理,當用戶點選返回的時候,我們會回到主介面,但是當第二次訊息再次送達時,點選彈框,此時不會再進行跳轉了。
問題原因:
經過排查發現,當從SingleInstance start Activity的時候,實則是預設帶上 FLAG_ACTIVITY_NEW_TASK 的,這個flag大家應該都挺熟悉,當我們用非Activity或Fragment的Context Start Activity的時候,都需要帶上這個flag,不然會報錯。那麼為什麼在APP退出的狀態下點選跳轉,第一次可以跳轉而第二次不能跳轉呢?這就是FLAG_ACTIVITY_NEW_TASK這個標誌位搞的鬼,第一次的時候,因為我們的APP是未開啟的狀態,所以,是沒有相應的Task的,這時候就可以正常的跳轉。當點選返回,因為做了特殊處理,使APP回到首頁,這時候,我們的Task就形成了。因為我們開啟的Activity和MainActivity都是同一個Task的,所以,從SingleInstance Start的時候,如果這個Task存在,就會把這個Task拉到前臺了,所以,這就是為什麼第二次點選了,沒反應的問題,因為,APP已經在前臺了。如果這個時候,我們按Home鍵返回桌面,再次點選彈框跳轉,會發現APP回到前臺了,但是仍舊沒有開啟我們想要跳轉的Activity,這剛好驗證前面的說明。下面是Google對SingleInstance的說明。
A "singleInstance" activity, on the other hand, permits no other activities to be part of its task. It's the only activity in the task. If it starts another activity, that activity is assigned to a different task — as if FLAG_ACTIVITY_NEW_TASK was in the intent.
問題解決:
我啟動的這個Activity在AndroidManifest裡面實則是宣告為SingleTask的LaunchMode的,但是仍是會出現這個問題。所以這裡,就我而言,我在啟動這個Activity的時候,同時設定了兩個flag FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TOP,實則也是達到SingleTask的效果,執行,問題解決。