現在市場上的應用大部分在打開時都不會打開兩個執行個體,類似QQ,因為該種方式的體驗性不好。
如:在打開QQ用戶端時,進入到聯系人界面,此時我們再按HOME鍵,此時會出現傳回桌面的情況,當我們再次打開應用的時候(點選QQ用戶端圖示或者在最近任務中打開),都會依然顯示我們當時退出的界面,即:聯系人界面,而不是重新啟動時出現的界面。
實作該類效果一般有3種方法可以實作:
1、在配置檔案中,在根Activity加上上面配置,即根Activity就是預設啟動的Activity,而不是一般的歡迎界面SplashActivity或者主界面MainActivity。
android:alwaysRetainTaskState="true"
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90TUPhXVU1UejpWT4FEVkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zM3MjN0cDN5ATNwMDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
注:預設的情況沒有做設定,預設啟動原始Activity,沒有上面的效果。
Android:alwaysRetainTaskState,總是保留任務棧的狀态。Task指得就是任務棧,用于記錄Activity的打開順序,保留狀态等。
如:打開用戶端一般順序是SplashActivity-->GuideActivity -->MainActivity,那麼此時任務棧的狀态就是下圖所示情況:
當我們在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