Android-Activity的生命週期全面分析

來源:互聯網
上載者:User

標籤:

Activity的生命週期分為兩部分:1,典型情況下的生命週期,指在使用者參與的情況下Activity所經過的生命週期的改變;2,異常情況下的生命週期,指Activity被系統回收或者當前裝置的Configuration發橫改變從而導致Activity被銷毀重建。
典型情況下的生命週期
在正常情況下,生命週期如下:
onCreate
表示Activity正在被建立,這是生命週期的第一個方法。在這個方法裡可以做一些初始化工作,比如調用setContentView去載入介面布局,初始化Activity所需的資料等。
onRestart
表示Activity正在重新啟動。一般情況下,噹噹前Activity從不可見到重新變為可見狀態時,onRestart方法會被調用。這種情況一般是使用者導致的,比如使用者按Home鍵切換到案頭或使用者開啟一個新的Activity,當前的Activity就會暫停,也就是onPause和onStop被執行了,接著使用者又回到了這個Activity,就會出現這種情況了。
onStart
表示Activity正在被啟動,即將開始,這時Activity已經可見了,但是還沒有出現在前台,還無法和使用者互動。也就是Activity已經出現了,但我們還不能看到。
onResume
表示Activity已經可見了,並且出現在前台開始活動了。
onPause
表示Activity正在停止,正常情況下,接著onStop就會被調用。此時可以執行一些儲存資料,停止動畫的操作,但是注意不能太耗時,因為這個方法結束,下一個Activity的onResume才能執行,如果時間太長會造成Activity切換卡頓。
onStop
表示Activity即將停止,可以做一些重量級的回收,但最好也不要太耗時。
onDestroy
表示Activity即將被銷毀,這是最後一個回調,做所有資源的釋放和回收。
經典圖片:

具體解釋

1,針對一個特定的Activity,第一次啟動,回調是onCreate->onStart->onResume。
2,當使用者開啟新的Activity或者切換到案頭時,回調是onPause->onStop。這裡有一個特殊情況,如果新的Activity採用透明主題,那麼當前Activity不會回調onStop。
3,當使用者再次回到Activity時,回掉是onRestart->onStart->onResume。
4,當使用者按Back鍵時,回調是onPause->onStop->onDestroy。
5,當Activity被系統回收後再次開啟,生命週期回調過程和(1)一樣。是生命週期方法一樣,不代表過程一樣。

異常情況下的生命週期
我們應該能夠猜到,Activity除了被使用者殺死外還有可能被系統殺死。情況如下:
情況1:資源相關的配置發生改變導致Activity被殺死並重新建立
拿最簡單的圖片資源來說吧,手機橫屏和豎屏時載入的圖片可能不是一個資源,那麼此時就會導致系統配置發生改變,在預設情況下,Activity會被銷毀並且重新建立,當然我們可以組織系統重新建立我們的Activity。Activity出現意外情況->onSaveInstanceState然後又兩種情況    ->onDestroy    ->onCreate->onRestoreInstanceState當前Android已經做了一定程度的資料恢複了。當然也可以重寫onSaveInstanceState和onRestoreInstanceState方法來實現自訂的資料的恢複。
情況2:資源記憶體不足導致優先順序低的Activity被回收
這種情況不容易類比,但是很容易能夠想到。1,前台Activity——正在和使用者互動,優先順序最高。2,可見但非前台Activity——比如彈出了一個對話方塊,導致Activity無法和使用者直接互動。3,後台Activity——已經被暫停Activity,優先順序最低。這些也會回調onSaveInstanceState和onRestoreInstanceState來儲存和恢複資料。一些工作不適合放在後台Activity中執行,最好是放進Service中執行。
阻止因系統配置發生改變而重新建立Activity

在mainfest中配置:

android:configChanges="orientation"

如果想指定多個值,用“|”來串連。
比如

android:configChanges="orientation|keyboardHidden"

這個配置項是非常多的,下面詳細介紹:

項目 含義
mcc SIM卡唯一標識IMSI(國際移動使用者識別碼)中的國家代碼,由三位元組成,中國是460。此項標識mcc發生改變
mnc SIM卡唯一標識IMSI(國際移動使用者識別碼)中的電訊廠商代碼,由兩位元組成,中國移動TD是00,中國聯通是01,中國電信是03。此項標識mnc發生改變
locale 裝置的本地位置發生了改變,一般是指切換了系統語言
touchscreen 無視它
keyboard 鍵盤類型發生了改變,比如用了外插鍵盤
keyboardHidden 鍵盤的可訪問性發生了改變,如果拔掉了外插鍵盤
navigation 無視它
screenLayout 螢幕布局發生改變,比如啟用了另一個螢幕
fontScale 系統字型發生改變
uiMode 使用者介面發生了改變,比如開啟了夜間模式(API8添加)
orientation 螢幕方向發生改變
screenSize 旋轉也會導致這個改變
smallestScreenSize 無視他
layoutDirection 無視他

Android-Activity的生命週期全面分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.