1. 程式人生 > >Android 第三方開啟App後現Launcher開啟導致重啟的問題

Android 第三方開啟App後現Launcher開啟導致重啟的問題

這暫且做一個備忘錄

問題

第一次遇到這個問題,測試同學說:
每次第一次安裝App後,開啟至第二級介面,退至後臺,然後再從Launcher介面點選Icon圖示啟動,會發現App會重新啟動,跳至首頁,而不是跳至上次開啟的第二級介面。但是如果把程序kill掉後,再從Launcher介面啟動,跳於二級介面—-》Home退至後臺—-》Launcher介面重新啟動,這樣就沒問題了。

開始,我也很納悶,看他操作也的確這樣,經過分析發現有個地方露出了馬腳,就是第一次啟動App的操作。最開始安裝時通過第三方安裝器安裝,完了直接在第三方應用裡面點選“開啟”按鈕。
而殺掉程序後的操作,是直接從Launcher介面啟動的。這裡肯定會涉及程序問題,及第三方應用啟動與Launcher啟動App的PID是不一樣的。

分析

比如:從第三方應用啟動App時,它的taskId 為 300,回到後臺,再從Launcher點選Icon啟動,它的taskId還是為300.這時如果你的MainActivity是設定成singleTask,那麼它會把你上面的所有介面都clear掉。
這也是為什麼第一次啟動停留在第二級介面,但從Launcher第二次啟動時,會重新啟動,停留在首頁的原因。因為第一次的二級介面都被第二次啟動的MainActivity給Clear掉了。

解決辦法

網上有篇文章介紹了幾種解決方法,這裡我只說下一種:
在Launch介面,判斷它是不是在根棧。如果不是,證明已經有在別的任務棧啟動了,則直接finish退出。

protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //如果是從第三方應用安裝後直接開啟,退至後臺後,再從Launcher開啟App,則第二次開啟會
        //被壓入至第一次的任務棧中,此時如果MainActivity設定成SingleTask,則它會清掉它上面的所有Activity.
        //這裡的做法,就是當第二次從Launcher啟動App時,在啟動頁建立的時候判斷下它所在的任務棧,是不是根棧。
        //若不是,則直接finish,不讓其進入MainActivity.
if (!isTaskRoot()) { finish(); return; } }

參考資料