1. 程式人生 > >廣播喚起一個介面A 按home鍵後 點選應用圖示應用重新載入未出現介面A

廣播喚起一個介面A 按home鍵後 點選應用圖示應用重新載入未出現介面A

問題 :

    我做的一個視訊通話專案,當程式未在介面中來電了,我通過監聽來電廣播來啟動一個通話介面(這時候intent的啟動模式Intent.FLAG_ACTIVITY_NEW_TASK)因為當前應用已經完全退出,沒有存在Task棧,不這樣設定程式會因為找不到存放activity的棧從而崩潰,所以要為啟動的童話介面開闢新的Task棧。然後問題來了,在這種情況下,我按home鍵,退回到裝置的launcher介面,這時候我們點選應用的圖示,發現並沒有顯示剛才啟動的通話介面 ,而是重新啟動了應用。然後按返回鍵會回到通話介面。

原因:

    因為點選icon圖示的時候,程式會自動載入起始介面 這時候也是建立一個新Task棧的過程,瞭解任務棧的會知道一個引數taskAffinity,他決定了一個介面存放的任務棧。顯然啟動介面和我的通話介面的taskAffinity不一致,導致了我們啟動的新task棧,在我們通話介面棧的上面,所以當我們按返回鍵的時候 新的task棧介面銷燬了,被壓在下面的任務站的通話介面就會展示出來。

解決辦法

    通過上述分析我們得知就是在點選icon圖示的時候新的任務站在我們視訊通話任務棧的上面,

 我們需要判斷:該意圖是開啟一個新的任務,還是將後臺的應用給提到前臺來.
 若是要將應用提到前臺來直接將這個Activity結束掉,然後顯示出來的Activity就是之前被最小化的Activity.
 因為點選圖示的意圖會將新啟動的Activity置於頂端,而頂端的下面的Activity就是之前被最小化的Activity.
 此時結束掉新啟動的Activity,就可以讓之前被最小化的Activity 顯示出來了.

可以在程式的入口介面新增如下判斷

if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
) != 0) { finish(); return; }

從而解決上述的問題。具體對兩句話的理解大家還可以自行研究