安卓Activity 的Flags介紹

這裏面只介紹那些特殊意義的Flags 與啓動模式相同那些就不一一介紹了

最近在工作中遇到一個問題,在首頁中打開某個view後 點擊home鍵回到桌面 再次點擊app icon後 之前被打開的view就會銷燬然後發現首頁的activity會重新啓動 重走onCreate生命週期。

後來發現有一個辦法可以有效的解決這個問題。

 if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0){
            LogUtils.i(TAG,"functionIN  getIntent.getFlags="+getIntent().getFlags()+"   Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT="+Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
            finish();


            return;
        }

FLAG_ACTIVITY_CLEAR_TOP
具有這個FLAG啓動的Activity會把之前啓動的Activity之上的Activity全部彈出棧空間。這個模式一般需要和FLAG_CTIVITY_NEW_TASK配合使用,在這種情況,被啓動Activity的實例如果已經存在,那麼系統就會調用它的onNewIntent。如果被啓動的Activity採用Standard模式啓動,那麼它連同它之上的Activitiy都要出棧,系統會創建新的Activity實例並放入棧頂。

FLAG_ACTIVITY_BROUGHT_TO_FRONT
如果activity在task存在,拿到最頂端,不會啓動新的Activity。這個有可能會誤導大家! 他這個FLAG其實是這個意思!比如說我現在有A,在A中啓動B,此時在A中Intent中加上這個標記。此時B就是以FLAG_ACTIVITY_BROUGHT_TO_FRONT方式啓動,此時在B中再啓動C,D(正常啓動C,D),如果這個時候在D中再啓動B,這個時候最後的棧的情況是 A,C,D,B。如果在A,B,C,D正常啓動的話,不管B有沒有用FLAG_ACTIVITY_BROUGHT_TO_FRONT啓動,此時在D中啓動B的話,還是會變成A,C,D,B的。

FLAG_ACTIVITY_NO_USER_ACTION
onUserLeaveHint()作爲activity週期的一部分,它在activity因爲用戶要跳轉到別的activity而要退到background時使用。比如,在用戶按下Home鍵,它將被調用。比如有電話進來(不屬於用戶的選擇),它就不會被調用。
那麼系統如何區分讓當前activity退到background時使用是用戶的選擇?

它是根據促使當前activity退到background的那個新啓動的Activity的Intent裏是否有FLAG_ACTIVITY_NO_USER_ACTION來確定的。

注意:調用finish()使該activity銷燬時不會調用該函數。

FLAG_ACTIVITY_NO_HISTORY
這個FLAG啓動的Activity,一旦退出,它不會存在於棧中,比方說!原來是A,B,C這個時候再C中以這個FLAG啓動D的,D再啓動E,這個時候棧中情況爲A,B,C,E。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有這個標記的Activity不會出現在歷史Activity的列表中,當某些情況下我們不希望用戶通過歷史列表回到我們的Activity的時候這個標記比較有用。它等同於在XML中指定Activity的屬性android:excludeFromRecents="true"。

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