- protected void onCreate(Bundle savedInstanceState):Activity被創(chuàng)建時調(diào)用
- protected void onStart():Activity被創(chuàng)建或者從后臺回到前臺時調(diào)用
- protected void onRestart():Activity從后臺回到前臺時調(diào)用
- protected void onResume():Activity創(chuàng)建或者或者從被覆蓋惦蚊、后臺重新回到前臺時調(diào)用(界面就可見了溺拱,用戶就可以看到界面了怔锌。)
- protected void onPause():Activity被覆蓋或者鎖屏時被調(diào)用
- protected void onStop():Activity跳轉(zhuǎn)到新的Activity或者退出時調(diào)用
- protected void onDestroy():Activity退出時調(diào)用
一、常見的生命周期過程:
1宋距、啟動Activity:系統(tǒng)會先調(diào)用onCreate方法轴踱,然后調(diào)用onStart方法,最后調(diào)用onResume谚赎,Activity進入運行狀態(tài)寇僧。
2、當前Activity被其他Activity覆蓋其上或被鎖屏:系統(tǒng)會調(diào)用onPause方法沸版,暫停當前Activity的執(zhí)行嘁傀。
3、當前Activity由被覆蓋狀態(tài)回到前臺或解鎖屏:系統(tǒng)會調(diào)用onResume方法视粮,再次進入運行狀態(tài)细办。
4、當前Activity轉(zhuǎn)到新的Activity界面或按Home鍵回到主屏蕾殴,自身退居后臺:系統(tǒng)會先調(diào)用onPause方法笑撞,然后調(diào)用onStop方法,進入停滯狀態(tài)钓觉。
5茴肥、用戶后退回到此Activity:系統(tǒng)會先調(diào)用onRestart方法,然后調(diào)用onStart方法荡灾,最后調(diào)用onResume方法瓤狐,再次進入運行狀態(tài)。
6批幌、當前Activity處于被覆蓋狀態(tài)或者后臺不可見狀態(tài)础锐,即第2步和第4步,系統(tǒng)內(nèi)存不足荧缘,殺死當前Activity皆警,而后用戶退回當前Activity:再次調(diào)用onCreate()、onStart()截粗、onResume()信姓,進入運行狀態(tài)。
7绸罗、用戶退出當前Activity:系統(tǒng)先調(diào)用onPause()意推,然后調(diào)用onStop(),最后調(diào)用onDestory()从诲,結(jié)束當前Activity左痢。
二、一個Activity的啟動完整生命周期。
1、 onCreate()--onStart()--onResume()--(點擊屏幕返回鍵后)--onPause()--onStop()--onDestroy()。
2实蔽、 onCreate()--onStart()--onResume()--(點擊屏幕HOME鍵后)--onPause()--onStop()(由桌面重新打開程序后)--onRestart()--onStart()--onResume()兽埃。
三、兩個Activity交互的生命周期?
1、ActivityA界面打開ActivityB logcat日志:
在B界面點擊返回按鈕后,B界面首先調(diào)用onPause(),然后A界面生命周期onRestart()-->onStart()-->onResume(),A界面可見后儡毕,B界面繼續(xù)從onPause()到onStop()--->onDestroy()銷毀也切。
3、從A界面跳轉(zhuǎn)到B界面腰湾,B是透明主題雷恃。
B界面生命周期:onCreate()-->onStart()-->onResume()
A界面不會調(diào)用onStop()方法。
4费坊、從透明主題B返回到A界面時倒槐。
四磕昼、Activity橫豎屏切換。
activity啟動后由豎屏切換到橫屏的生命周期:
onCreate()-->onStart()-->onResume()(顯示界面后切換到橫屏)-->onPause()-->onStop()-->onDestroy()-->onCreate()-->onStart()-->onResume().
在橫豎屏切換的時候為了保證界面的數(shù)據(jù)或者狀態(tài)時票从,android為我們提供了onSaveInstanceState(Bundle outState)和onRestoreInstanceState(Bundle savedInstanceState)用于保存和恢復數(shù)據(jù)漫雕。
1、onSaveInstanceState(Bundle outState)在什么時機會被調(diào)用呢峰鄙?
當activity有可能被系統(tǒng)回收的情況下浸间,而且是在onStop()之前。注意是有可能吟榴,如果是已經(jīng)確定會被銷毀魁蒜,比如用戶按下了返回鍵,或者調(diào)用了finish()方法銷毀activity,則onSaveInstanceState不會被調(diào)用兜看∽断蹋或者也可以說,此方法只有在activity被異常終止的情況下會被調(diào)用细移。
onSaveInstanceState(Bundle outState)會在以下情況被調(diào)用:
①搏予、當用戶按下HOME鍵時。
②弧轧、從最近應用中選擇運行其他的程序時雪侥。
③、按下電源按鍵(關(guān)閉屏幕顯示)時精绎。
④速缨、從當前activity啟動一個新的activity時。
⑤代乃、屏幕方向切換時(無論豎屏切橫屏還是橫屏切豎屏都會調(diào)用)鸟廓。
在前4種情況下,當前activity的生命周期為:
onPause -> onSaveInstanceState -> onStop襟己。
(這個是我測試的結(jié)果引谜,但是根據(jù)《Android開發(fā)藝術(shù)探索》,說onPause和onSaveInstanceState的順序是不一定的)
2擎浴、onRestoreInstanceState什么時機被調(diào)用员咽?
onRestoreInstanceState(Bundle savedInstanceState)只有在activity確實是被系統(tǒng)回收,重新創(chuàng)建activity的情況下才會被調(diào)用贮预。
比如第5種情況屏幕方向切換時贝室,activity生命周期如下:
onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume
在這里onRestoreInstanceState被調(diào)用,是因為屏幕切換時原來的activity確實被系統(tǒng)回收了仿吞,又重新創(chuàng)建了一個新的activity滑频。
而按HOME鍵返回桌面,又馬上點擊應用圖標回到原來頁面時唤冈,activity生命周期如下:
onPause -> onSaveInstanceState -> onStop -> onRestart -> onStart -> onResume
因為activity沒有被系統(tǒng)回收峡迷,因此onRestoreInstanceState沒有被調(diào)用。
如果onRestoreInstanceState被調(diào)用了你虹,則頁面必然被回收過绘搞,則onSaveInstanceState必然被調(diào)用過。
3傅物、onCreate()里也有Bundle參數(shù)夯辖,可以用來恢復數(shù)據(jù),它和onRestoreInstanceState有什么區(qū)別董饰?
因為onSaveInstanceState 不一定會被調(diào)用蒿褂,所以onCreate()里的Bundle參數(shù)可能為空圆米,如果使用onCreate()來恢復數(shù)據(jù),一定要做非空判斷啄栓。
而onRestoreInstanceState的Bundle參數(shù)一定不會是空值榨咐,因為它只有在上次activity被回收了才會調(diào)用。
而且onRestoreInstanceState是在onStart()之后被調(diào)用的谴供。有時候我們需要onCreate()中做的一些初始化完成之后再恢復數(shù)據(jù)块茁,用onRestoreInstanceState會比較方便。下面是官方文檔對onRestoreInstanceState的說明:
This method is called after onStart() when the activity is being re-initialized from a previously saved state, given here in savedInstanceState. Most implementations will simply use onCreate(Bundle) to restore their state, but it is sometimes convenient to do it here after all of the initialization has been done or to allow subclasses to decide whether to use your default implementation.
注意這個說明的最后一句是什么意思桂肌?
to allow subclasses to decide whether to use your default implementation.
它是說数焊,用onRestoreInstanceState方法恢復數(shù)據(jù),你可以決定是否在方法里調(diào)用父類的onRestoreInstanceState方法崎场,即是否調(diào)用super.onRestoreInstanceState(savedInstanceState);
而用onCreate()恢復數(shù)據(jù)佩耳,你必須調(diào)用super.onCreate(savedInstanceState);否則會報錯。
Activity橫豎屏設(shè)置
方式1:AndroidManifest.xml
<activity android:name="MainActivity" android:screenOrientation="landscape" /> // 或者 “portrait”
方式2:代碼實現(xiàn)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
獲取橫屏方向
int orientation = this.getResources().getConfiguration().orientation;
orientation 的常用取值可以為
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE(橫屏)ActivityInfo.SCREEN_ORIENTATION_PORTRAIT(豎屏)