原文首發至我的個人博客:yanhuili.github.io
現在討論activity生命周期的文章已經很多了,但是有時候看得太多反而會覺得思緒很亂。這篇博的目的就是幫助你快速的理清思路,也是自己學習的一些總結。
首先什么是Activity?
在很多的書籍里面將其直譯為活動。因為像比如service之類的在后臺跑著的服務,也可以稱作是活動的一種,言下之意是同一個活動里面,有前臺的部分和后臺的部分(通常就是service)。因此我認為恰當的翻譯應該是:直接和用戶交互的組件。在這里的話,我就盡量只用activity而不使用活動作為描述。Activity的生命周期先上一個最經典的Activity生命周期的圖片:
onCreate()
在onCreate方法里面,表示的的是一個activity正在被創建,這是activity啟動的第一個方法,在這個方法里面,我們一般完成一些界面布局文件的初始化,綁定layout,setContentView,findviewbyid的初始化工作。
onStart()
onStart方法在活動由不可見到可見的時候調用,在實際的開發過程中,onCreate方法執行過一次就不再執行了,因此我的經驗而言,會在onStart方法里面更新適配器,重新拿到數據,更新UI界面。
onResume()
當這個方法調用的時候,說明activity已經等待和用戶發生交互了,并出于運行的狀態,位于返回棧頂部。
onPause()
當系統正在啟動或者恢復另一個activity的時候,這個方法得到執行。在這個方法里面,我們通常保存一些重要的數據,釋放一些資源,以便以后恢復的時候能完善用戶體驗
onStop()
這個方法在activity變得完全不可見的時候調用,如果只是得到一個透明的對話框,提示框的話,onPause方法會得到執行,onStop方法不會執行。
onDestroy()
這個方法在activity被摧毀之前調用,之后activity處于銷毀狀態,我們一般在這里,unregisterBroadcast,否則會拋出一個異常。
onRestart()
當activity從停止狀態變為運行狀態(重新啟動)的時候,此方法得到調用。
完整的生命周期
完整的一個activity的生命周期,指的是從onCreate方法到ondestroy方法結束的整個過程。
前臺生存期
activity從onRemuse方法到onPause方法之間的過程,整個過程是用戶可見,可交互的。
總結
當一個activity(A)啟動的時候:
onCreate()->onStart()->onResume().以上三個方法會率先執行,等待用戶操作。啟動第二個Activity(B)并且完全遮擋住A的時候。A會先執行
onPause()->onStop()```
如果此時點擊back返回按鈕,A會執行
```java
onRestart()->onStart()->onResume().```
當啟動的第二個activity(B)沒有完全遮擋住A的時候,A只會執行onPause方法,比如說彈出一個對話框,dialog之類的。當用戶點擊返回的時候,A會執行onResume方法,如圖所示,執行。
```java
onPause()->onResume()```
有一點需要特別注意的,當正在處于onPause或者onStop階段的activity有時候會遇到更高優先級的另外的activity啟動,或者內存不夠,所以系統會回收內存,隨即把我們的activity回收掉。當我們返回原activity在時候,就需要從onCreate方法開始重新創建。
# 活動回收了怎么辦
如果很不湊巧,在系統回收的activity里面恰好有存放的數據,我們注意到onSaveInstanceState(Bundle savedInstanceState),有個bundle對象,這個bundle對象就是用來存儲數據的。
```java
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData= "some data you need store";
output.putstring("data",tempdata);
采用這個方法用來保存零時的數據,用鍵值對的方式來保存。然后在oncreate方法種來恢復。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState!=null){
String tempData=savedInstanceState.getString("data");
}
如果savedInstanceState的值不為空的話,即可取出值。
參考資料:
《第一行代碼》 郭霖。