Android Activity 生命週期和重要的相關函數(基礎一)



總結:
1.oncreate
2.onstart            可見但不交互
3.onrestart         從其他界面重新調轉過來
4.onresume       可交互
5.onpase
6.onstop            不可見
7.ondestroy




BACK鍵:

當我們按BACK鍵時,我們這個應用程序將結束,這時候我們將先後調用onPause()->onStop()->onDestory()三個方法,如下圖所示:



HOME鍵:

當我們打開應用程序時,比如瀏覽器,我正在瀏覽NBA新聞,看到一半時,我突然想聽歌,這時候我們會選擇按HOME鍵,然後去打開音樂應用程序,

而當我們按HOME的時候,Activity先後執行了onPause()->onStop()這兩個方法,這時候應用程序並沒有銷燬。如下圖所示:



而當我們再次啓動ActivityDemo應用程序時,則先後分別執行了onRestart()->onStart()->onResume()三個方法,如下圖所示:

1.OnstartActivityResult

2.onnewintent

3.onSaveInstanceState

4.onconfigChange

5.setTheme

onStart是可見,但並不可交互的,onResume纔可交互的,這也是onStart(可見)和onResume(可見且可交互,在前臺了)的區別

場景:

在實際應用場景中,假設A Activity位於棧頂,此時用戶操作,從A Activity跳轉到B Activity。那麼對AB來說,具體會回調哪些生命週期中的方法呢?回調方法的具體回調順序又是怎麼樣的呢?

開始時,A被實例化,執行的回調有A:onCreate -> A:onStart -> A:onResume。

當用戶點擊A中按鈕來到B時,假設B全部遮擋住了A,將依次執行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。

此時如果點擊Back鍵,將依次執行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。

至此,Activity棧中只有A。在Android中,有兩個按鍵在影響Activity生命週期這塊需要格外區分下,即Back鍵和Home鍵。我們先直接看下實驗結果:

此時如果按下Back鍵,系統返回到桌面,並依次執行A:onPause -> A:onStop -> A:onDestroy。

此時如果按下Home鍵(非長按),系統返回到桌面,並依次執行A:onPause -> A:onStop。由此可見,Back鍵和Home鍵主要區別在於是否會執行onDestroy。



     在之前的項目開發過程中,當時遇到一個很奇怪的問題:手機上的“開發者選項”中有一個“不保留活動”的設置,當開啓此設置,手機上的設置提示是“用戶離開後即銷燬每個活動”,開啓後,對於其他的應用程序是從A Acticity到B Activity,然後Back鍵回到A,此時,其他應用程序只是先白屏(有可能黑屏等,取決於主題設置)一下,然後A開始可見,但是我的應用程序中出現的一個結果卻是直接返回到了桌面。一開始百思不得其解。最後終於定位出問題。首先,我們需要明確開啓此設置項後對Activity生命週期的影響。開啓此設置項後,當A到B時,假設B全部遮擋住了A,將依次執行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop -> A:onDestroy。是的,A在系統原本的生命週期回調中增加了onDestroy。此即“用戶離開後即銷燬每個活動”的含義。但此時需要注意的是,只要沒有認爲的調用A的finish()方法,雖然A執行了onDestroy,但Activity棧中依然保留有A,此時B處於棧頂。那麼在B中按Back鍵回到A時,將依次執行:B:onPause -> A:onCreate -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。沒錯,A從onCreate開始執行了。此處也就解釋了爲什麼A可能會出現白屏(或黑屏等)一下的原因了。

這樣的結果:開啓“不保留活動設置” ,back鍵或者不可見或者home,都執行Ondestroy方法,但是棧沒有被移除!

如果需要移除可以執行:


AppManager.getAppManager().finishActivity(this);

 1 /** 2  * 結束指定的Activity
 3  */ 4 public void finishActivity(Activity activity) {
 5     if (activity != null) {
 6         activityStack.remove(activity);
 7         activity.finish();
 8         activity = null;
 9     }
10 }


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