目錄:
[TOC]
1园欣、生命周期方法
onCreate()
觸發(fā)時機:當Activity第一次啟動的時候。
作用:完成Activity的初始化工作(包括視圖的創(chuàng)建拆吆,數(shù)據(jù)的綁定等等)存和。
注意:該方法的參數(shù)(Bundle savedInstanceState),savedInstanceState是通過調用onSaveInstanceState()保存下的狀態(tài)信息渣窜。如果它為null,系統(tǒng)則是創(chuàng)建一個新的Activity實例宪躯,而不是恢復之前被Destory的Activity乔宿。onRestart()
觸發(fā)時機:當處于停止狀態(tài)的Activity需要再次展現(xiàn)給用戶的時候。
執(zhí)行時機:在onCreate()之后访雪,onStart()之前執(zhí)行详瑞。
作用:執(zhí)行一些特殊的恢復(restoration)工作掂林,請注意之前是被stopped而不是destrory。onStart()
觸發(fā)時機:所屬活動將被展現(xiàn)給用戶坝橡。
作用:比較好的地方來驗證某些必須的系統(tǒng)特性是否可用泻帮,例如廣播等。 onStop()里面做了哪些清除的操作计寇,就該在onStart()里面重新把那些清除掉的資源重新創(chuàng)建出來锣杂。onResume()
觸發(fā)時機:當Activity和用戶發(fā)生交互的時候。
作用:初始化那些在onPause()方法里面釋放掉的組件番宁,并執(zhí)行那些activity每次進入onResume()都需要的初始化動作 (例如開始動畫與初始化那些只有在獲取用戶焦點時才需要的組件)元莫。onPause()
觸發(fā)時機:當一個Activity失去系統(tǒng)焦點后,當另一個Activity啟動時或返回前一個Activity時蝶押。
作用:停止動畫或者是其他正在運行的操作踱蠢,那些都會導致CPU的浪費;
提交在用戶離開時期待保存的內容(例如郵件草稿)棋电;釋放系統(tǒng)資源朽基,例如broadcast receivers, sensors (比如GPS), 或者是其他任何會影響到電量的資源。
注意:無論什么原因導致Activity停止离陶,系統(tǒng)總是會在onStop()之前調用onPause()方法。onStop()
觸發(fā)時機:當一個Activity不再需要展示給用戶的時候衅檀。
作用:Activity不再可見招刨,并且應該釋放那些不再需要的所有資源,從而避免內存泄漏哀军。
注意:如果內存緊張沉眶,系統(tǒng)會直接結束這個Activity,而不會觸發(fā) onStop 方法杉适。 所以保存狀態(tài)信息是應該在onPause時做谎倔,而不是onStop時做。在一些情況下猿推,onPause方法或許是Activity觸發(fā)的最后的方法片习,因此需要在這個時候保存需要保存的信息。onDestory()
觸發(fā)時機:當Activity銷毀的時候蹬叭。
作用:最后去清除那些可能導致內存泄漏的地方藕咏。因此需要確保那些線程都被destroyed并且所有的操作都被停止。
注意:onDestory()和 onStop()一樣秽五,如果內存緊張孽查,系統(tǒng)會直接結束這個活動而不會觸發(fā)該方法。onRestoreInstanceState()
觸發(fā)時機:只有在Activity銷毀重建的時候坦喘。
執(zhí)行時機:會在onStart()和onResume()之間執(zhí)行盲再。
作用:恢復異常關閉時保存的數(shù)據(jù)绸栅。onSaveInstanceState()
觸發(fā)時機:當跳轉Activity或應用遇到意外情況(內存不足,用戶直接按home鍵)由系統(tǒng)直接銷毀Activity時术辐。
執(zhí)行時機:會在onPause()或onStop()之前執(zhí)行渡处。
作用:系統(tǒng)調用該方法,允許Activity保存之前的狀態(tài)绿映,例如:EditText 組件中的文本或 ListView 的滑動位置擒滑。
2、生命周期的三種分類
-
完整生命周期(Entire lifetime)
onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy() -
可見生命周期(Visible lifetime)
onStart() -> onResume() -> onPause() -> onStop() -
前臺生命周期(Foreground lifetime)
onResume() -> onPause()
3叉弦、生命周期方法啟動順序
-
常規(guī)啟動
onCreate()—>onStart()—>onResume() -
當另一個Activity啟動時
Activity_1 onPause() —>
Activity_2 onCreate() —> onStart() —> onResume() —>
Activity_1 onStop() -
當返回到之前Activity時
Activity_2 onPause() —>
Activity_1 onRestart() —> onStart() —> onResume() —>
Activity_2 onStop() —> onDestroy()
4丐一、生命周期方法銷毀順序
-
異常銷毀
onPause() —> <Process Killed> -
異常銷毀
onPause() —> onStop() —> <Process Killed> -
正常銷毀
onPause() —> onStop() —> onDestroy()
5、Activity的四種狀態(tài)
-
活動狀態(tài)(Runing)
處于棧頂淹冰,處于可見并可和用戶交互的激活狀態(tài)库车。
活動狀態(tài)觸發(fā)的函數(shù)及順序為:
onCreate() —> onStart() —> onResume()。 -
暫停狀態(tài)(Paused)
當 Activity 被另一個透明或者 Dialog 樣式的 Activity 覆蓋時的狀態(tài)樱拴。此時它依然與窗口管理器保持連接柠衍,系統(tǒng)繼續(xù)維護其內部狀態(tài),所以它仍然可見晶乔,但它已經(jīng)失去了焦點故不可與用戶交互珍坊。
活動狀態(tài)到暫停狀態(tài)所觸發(fā)的函數(shù)及順序為:
onResume() —> onPuased()。
暫停狀態(tài)恢復至活動狀態(tài)所觸發(fā)的函數(shù)及順序為:
onPuased() —> onResume()正罢。 -
停止狀態(tài)(Stoped)
當 Activity 被另外一個 Activity 覆蓋阵漏、失去焦點并不可見時處于 Stoped 狀態(tài)。
暫停狀態(tài)到停止狀態(tài)所觸發(fā)的函數(shù)及順序為:
onPuased() —> onStop()翻具。
停止狀態(tài)恢復至活動狀態(tài)所觸發(fā)的函數(shù)及順序為:
onStop() —> onRestart() —> onStart() —> onResume()履怯。 -
死亡狀態(tài)(Killed)
Activity 被系統(tǒng)殺死回收或者沒有被啟動時處于 Killed 狀態(tài)。
停止狀態(tài)到死亡狀態(tài)分為兩種情況:
情況一:由用戶操作導致裆泳,則執(zhí)行onStop() —> onDestroy()叹洲。
情況二:由系統(tǒng)自動強制執(zhí)行,則該Activity被強行結束工禾。
6运提、Back鍵與Home鍵區(qū)別
-
Back鍵
默認行為是finish處于前臺的Activity,即Activity的狀態(tài)為Destroy狀態(tài)為止闻葵,若再次啟動該Activity是從 onCreate()開始糙捺,不會調用onSaveInstanceState()。 -
Home鍵
默認行為是Stop處于前臺的Activity笙隙,即Activity的狀態(tài)為Stop狀態(tài)為止洪灯,而不是Destroy。
若再次啟動該Activity,會調用onSaveInstanceState() 方法签钩,保持上次Activity的狀態(tài)則是從OnRestart() —> onStart() —> onResume()掏呼。
7、Activity中數(shù)據(jù)保存與恢復
-
保存數(shù)據(jù)
onPause()铅檩,onSaveInstance(bundle)憎夷。 -
恢復數(shù)據(jù)
onCreate(Bundle), onRestoreInstanceState(budle)。
默認情況下onSaveInstanceSate()和onRestoreInstanceState()會對UI狀態(tài)進行保存和恢復昧旨,如果需要保存其他數(shù)據(jù)可以在onSaveInstanceState()拾给,onPause()保存。
注意:如果是持久化的數(shù)據(jù)得通過onPause()保存(google推薦)兔沃。
8蒋得、Activity的加載模式
-
設置加載模式的兩種方法
- Intent對象中設置的Flag;
- AndroidManifest.xml中進行設置乒疏,launchMode屬性额衙。
-
四種加載模式
-
standard
默認模式,可以不用寫配置怕吴∏喜啵可以有多個相同的實例,也允許多個相同Activity疊加转绷。 -
singleTop
可以有多個相同的實例伟件,但不允許多個相同Activity疊加。即议经,如果Activity在棧頂?shù)臅r候锋爪,啟動相同的Activity,不會創(chuàng)建新的實例爸业,而會調用其onNewIntent方法。 -
singleTask
只有一個實例亏镰。啟動時候扯旷,若Activity不存在,則會在當前task創(chuàng)建一個新的實例索抓,若存在钧忽,則會把task中在其之上的其它Activity destory掉并調用它的onNewIntent方法。如果在別的應用程序中啟動它逼肯,則會新建一個task耸黑,并在該task中啟動這個Activity,并且允許別的Activity與其在一個task中共存篮幢。 -
singleInstance
只有一個實例大刊,并且這個實例獨立運行在一個task中,這個task只有這個實例三椿,不允許有別的Activity存在缺菌。
-
standard
9葫辐、Activity的棧管理
10、典型問題及解決方案
- 屏幕旋轉Activity銷毀重建
- 不設置Activity的android:configChanges時伴郁,切屏會重新調用各個生命周期耿战,切橫屏時會執(zhí)行一次,切豎屏時會執(zhí)行兩次焊傅。
- 設置Activity的android:configChanges=”orientation”時剂陡,切屏還是會重新調用各個生命周期,切橫狐胎、豎屏時只會執(zhí)行一次鸭栖。
- 在Android3.2之前,設置Activity的android:configChanges=”orientation|keyboardHidden”時顽爹,切屏不會重新調用各個生命周期纤泵,只會執(zhí)行onConfigurationChanged方法。但在Android3.2及其之后镜粤,仍會重新調用各個生命周期一次捏题,因為screen size也開始跟著設備的橫豎切換而改變。
- Android3.2及其之后肉渴,設置Activity的android:configChanges=”orientation|keyboardHidden|screenSize“公荧,切屏不會重新調用各個生命周期,只會執(zhí)行onConfigurationChanged方法同规。
- 解決方案鏈接