天天看點

Android實作不重複啟動APP的方法

    現在市場上的應用大部分在打開時都不會打開兩個執行個體,類似QQ,因為該種方式的體驗性不好。

如:在打開QQ用戶端時,進入到聯系人界面,此時我們再按HOME鍵,此時會出現傳回桌面的情況,當我們再次打開應用的時候(點選QQ用戶端圖示或者在最近任務中打開),都會依然顯示我們當時退出的界面,即:聯系人界面,而不是重新啟動時出現的界面。

實作該類效果一般有3種方法可以實作:

1、在配置檔案中,在根Activity加上上面配置,即根Activity就是預設啟動的Activity,而不是一般的歡迎界面SplashActivity或者主界面MainActivity。

android:alwaysRetainTaskState="true"
           
Android實作不重複啟動APP的方法

注:預設的情況沒有做設定,預設啟動原始Activity,沒有上面的效果。

Android:alwaysRetainTaskState,總是保留任務棧的狀态。Task指得就是任務棧,用于記錄Activity的打開順序,保留狀态等。

如:打開用戶端一般順序是SplashActivity-->GuideActivity -->MainActivity,那麼此時任務棧的狀态就是下圖所示情況:

Android實作不重複啟動APP的方法

當我們在MainActivity頁面按HOME鍵退出時,此時任務棧的狀态繼續儲存下來,當再次打開是系統就會自動判定是否存在以設定根Activity為根的Activity的棧,如有,則使用該棧頂的Activity。

2、設定調用moveTaskToBack(boolean)

public void onBackPressed(){

    /**
     * 傳回上一次停留頁面
     */
    moveTaskToBack(true);
}
           

該方法的不足之處就是當使用者安裝了多個桌面應用的時候,可能會出現對話框提示,以選擇一個應用運作。

該方法不會改變task中的Activity中的順序,當使用者按傳回鍵是不希望程式退出(預設是finish),而是希望在背景運作,該種方法是一個不錯的選擇。此時的程式雖然已經退出,但程序并沒有被殺死。

3、設定意圖FLAG_ACTIVITY_NEW_TASK。設定此狀态,首先會查找是否存在和被啟動的Activity具有相同的親和性的任務棧(即taskAffinity,注意同一個應用程式中的Activity的親和性是一樣的),如有,則直接把剛剛這個棧整體移動到前台,并保持棧中的Activity的順序不變,如果沒有,則建立一個棧存放被啟動的Activity。

親和性相同:

Activity A啟動開辟Task堆棧(堆棧狀态為A),在Activity A中啟動Activity B,啟動Activity B的Intent的Flag設定為FLAG_ACTIVITY_NEW_TASK,Activity B被壓入Activity A所在的堆棧,堆棧狀态為AB,此時A和B的親和性相同,并出現在同一個棧中。

public void onBackPressed(){

    /**
     * 傳回系統預設頁面
     */
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);
}

           

該方式是将整個任務棧放在背景進行,與方式2不同的是,方法2是傳回預設的桌面頁面,方法3是傳回上次桌面停留的頁面。

Good luck!

Write by Jimmy.li