我們知道Android中的活動是可重疊的。我們每啟動一個新的活動,就會覆蓋當前的活動,然后點擊Back就會銷毀最上面的活動,下面的一個活動就會重新顯示出來。
安卓使用任務來管理,一個任務就是放在棧里的活動集合 也叫返回棧,
每個活動在生命周期中對多4種狀態, 運行 暫停(對話框 ,后面的也是可見的只有在內存極低的時候系統不得已才會去回收這個東西,) 停止(不可見系統保存狀態和成員變量,不可靠 內存不夠就可能被干掉) 銷毀
oncreat(第一次被創建的時候,完成初始化操作,加載布局綁定事件)------onsatrt(不可見到可見)------onResume(準備好和用戶進行交互調用,活動位于棧頂,) ------
onPause (在準備去啟動其他活動,一般釋放消耗CPU的以及保存一些關鍵數據,但是這個方法執行要快不然影響到后面的活動)------onStop(完全看不見的時候) ------onDestory(活動被銷毀之前調用) ------ onRestart
onsatrt 和 onstop 對資源加載釋放
其實Anroid是使用任務【Task】來管理活動的,一個任務就是一組存放在棧里的活動的集合,這個棧也被稱作返回棧。棧是一種后進先出的數據結構,在默認情況下,每當我們啟動了一個新的活動時,處于棧頂的活動會出棧,這時前一個入棧的活動就會重新處于棧頂的位置。系統總是會顯示處于棧頂的活動給用戶。
下面說一下活動在其生命周期的四種狀態:
1、運行狀態
當一個活動位于返回棧的棧頂時,這時活動就處于運行狀態。系統最不愿意回收的就是處于運行狀態的活動,因為這會帶來非常差的用戶體驗。
1
1
2、暫停狀態
當一個活動已經不再處于棧頂,但是仍然可見,這時活動就進入了暫停狀態。你可能說既然活動既然不在棧頂了,還怎么會可見呢?這是因為并不是每一個活動都會占滿整個屏幕,比如對話框形式的活動只會占用屏幕中間的部分區域。系統也不愿意去回收這種活動。除非是內存極低的情況。
1
1
3、停止狀態
當一個活動不再處于棧頂位置,并且完全不可見時,就進入了停止狀態,系統仍然需要仍然為這種活動保存相應的狀態和成員變量,但是這并不是完全可靠的,當其他地方需要內存的時候,停止狀態的活動就會被系統回收。
1
1
4、銷毀狀態
當一個活動從返回棧中移除后就變成了銷毀狀態。系統就會最傾向于回收處于這種狀態的活動,從而保證手機的內存充足。
1
1
Activity類中定義了7個回調方法,覆蓋了活動生命周期的每一個環節,下面就一一介紹這7個方法。
Oncreate();
會在活動第一次被創建時調用。可以在這里完成初始化操作,比如加載布局,綁定事件
1
1
Onstart();
這個方法在活動由不可見到可見時調用
1
1
OnPause()
這個方法在系統準備去啟動或恢復另一個活動時調用。我們通常在這個方法中將一些消耗CPU的資源消耗掉,以及保存一些關鍵數據,但這個方法的執行速度一定要快,不然會影響到新的棧頂活動的使用。
1
1
Onstop()
在活動完全不可見時調用,它和Onpause的區別是,如果新啟動的活動是一個對話框式的活動,那么OnPuase方法會得到執行,而OnStop方法不會執行
1
1
OnDestory()
在活動被銷毀時調用
1
1
OnRestart()
在活動由不可見到可見時調用
1
1
以上7個方法除了OnRestart()方法,其他都是兩兩相對的,從而又可以將活動分為3種生存期
完整生存期——OnCreate——OnDestory
可見生存期——OnStart——OnStop
前臺生存期——OnResume——OnPause
ok,前面說活動狀態的過程中提到了系統回收,那么就產生了一個問題,假設我正在活動A編輯文字,跳轉到了B,A就處于停止狀態了,這是系統內存不足,A被回收。當從B再到A時,新建A活動,之前編輯的東西都丟了,這是很影響用戶體驗的。
怎么辦呢?
Activity中有一個OnSaveInstance()回調方法,這個方法可以保證在活動被回收之前一定被調用,因此我們可以通過這個方法來解決活動被回調時數據得不到保存的問題。 代碼如下
OnSaveInstenceState() 這個方法有兩個,選只有1個的參數那個這個方法保證活動被回收前一定被調用 攜帶了bundle 參數,提供了系列的保存方法,putStriing(鍵 ,值) putInt
@Override
@Overrideprotected void OnSaveInstanceState(Bundle outState) { super.onSaveInstance(outState); String tempData = "Something you just typed"; outState.putString("data_key, tempData);}
1
2
3
4
5
6
1
2
3
4
5
6
同時修改OnCreate()方法
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState != null) { String tempData = savedInstanceState.getString("data_key"); } }