安卓app點開後點擊home鍵再打開app重啓問題

正常情況下,點擊 Home 鍵回到桌面,App 進程沒有被殺掉,再次進入 APP 應該都是回到之前顯示的頁面。
但是在某些不知名的情況下,也可能是某些手機會有這個問題。點擊了 APP圖標 是重新打開 APP

 

當我們點擊home界面的應用啓動圖標時,如果沒有對應Task任務棧存在,則會創建一個新的任務棧,並且把應用啓動的首頁面作爲根Activity放到任務棧中。

如果存在對應的Task任務棧,則會直接調用對應的Task任務棧到前臺,並將棧頂的界面顯示給用戶,

那麼當我們的app啓動後打開SplashActivity並跳轉主界面MainActivity後,我們app的任務棧應該如圖所示:

此時,當我們點擊Home鍵退回到桌面,app的Task任務棧進入後臺,然後我們點擊桌面上的啓動圖標,正常情況下,app應該會把它對應的Task任務棧調到前臺,並顯示剛剛棧頂的MainActivity界面,

正常流程

然而,實際情況是,app會把它的Task任務棧調用到前臺,並在任務棧上重新創建新的SplashActivity ,再跳轉到MainActivity,

在不重新加載application的情況下,它又重新走了一遍啓動的流程,這個時候,我們會發現任務棧中的Activity重複了,SplashActivity跟MainActivity都變成了兩個

爲了更清晰的讓大家理解,這裏畫了兩個圖

bug流程:


新調用的SplashActivity會被置於該app的task棧頂


多出了兩個Activity

那麼對於這種問題我們如何來處理呢?

按照上文的舉例,
在正常流程下啓動app進入MainActivity界面時的任務棧:

正常情況

bug情況下,會調起任務棧到前臺並添加根Acitivy SplashActivity到棧頂,此時的任務棧:


我們可以看到,在bug情況下啓動app時,SplashActivity(app的根Activity)再次創建併疊加到Task任務棧上了

 

理應只會出現在棧底的SplashActivity出現在了其他位置,所以這裏我們直接判斷了app根Activity SplashActivity的位置

在app的SplashActivity(app的根Activity)的onCreate方法中通過 isTaskRoot() 方法來判斷是否是任務棧中的根Activity,如果是就不做任何處理,如果不是則直接finish掉;

 

public class SplashActivity extends BaseActivity {
@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        setTheme(R.style.AppTheme_NoActionBar);
        super.onCreate(savedInstanceState);

        if (!isTaskRoot()) {
            finish();
            return;
        }
    }
}

或在啓動頁上添加

if (!isTaskRoot()) {
    //判斷當前啓動的activity在任務棧中存在
    final Intent intent = getIntent();
    final String intentAction = intent.getAction();
    if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null &&
            intentAction.equals(Intent.ACTION_MAIN)) {
        //若當前啓動的activity是首頁則關閉,即代表是點擊了home鍵重新啓動了activity
        finish();
        return;
    }
}

這樣棧頂的SplashActivity在還未執行其他代碼的情況下就finish()掉了,此時會顯示棧頂的MainActivity。

參考:https://www.jianshu.com/p/eea14ca0b164

https://www.jianshu.com/p/e220ab03314b

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