Android 使用任務(wù)(Task)來管理活動冈涧,一個任務(wù)就是一組存放在棧里的活動的集合,后進先出督弓。
一、活動狀態(tài)
每個活動在其生命周期中最多可能會有四種狀態(tài)愚隧。
1. 運行狀態(tài)
當一個活動位于返回棧的棧頂時,這時活動就處于運行狀態(tài)。系統(tǒng)最不愿意回收的就是處于運行狀態(tài)的活動录煤,因為這會帶來非常差的用戶體驗。
2. 暫停狀態(tài)
當一個活動不再處于棧頂位置妈踊,但仍然可見時,這時活動就進入了暫停狀態(tài)廊营,比如對話框形式的活動只會占用屏幕中間的部分區(qū)域歪泳,處于暫停狀態(tài)的活動仍然是完全存活著的露筒,系統(tǒng)也不愿意去回收這種活動(因為它還是可見的呐伞,回收可見的東西都會在用戶體驗方面有不好的影響)慎式,只有在內(nèi)存極低的情況下伶氢,系統(tǒng)才會去考慮回收這種活動瞬捕。
3. 停止狀態(tài)
當一個活動不再處于棧頂位置鞍历,并且完全不可見的時候肪虎,就進入了停止狀態(tài)劣砍。系統(tǒng)仍然會為這種活動保存相應(yīng)的狀態(tài)和成員變量扇救,但是這并不是完全可靠的刑枝,當其他地方需要內(nèi)存時迅腔,處于停止狀態(tài)的活動有可能會被系統(tǒng)回收装畅。
4. 銷毀狀態(tài)
當一個活動從返回棧中移除后就變成了銷毀狀態(tài)沧烈。系統(tǒng)會最傾向于回收處于這種狀態(tài)的活動掠兄,從而保證手機的內(nèi)存充足锌雀。
二蚂夕、活動的生存期
Activity 類中定義了七個回調(diào)方法腋逆,覆蓋了活動生命周期的每一個環(huán)節(jié)。
1. onCreate()
它會在活動第一次被創(chuàng)建的時候調(diào)用惩歉。應(yīng)該在這個方法中完成活動的初始化操作等脂,比如說加載布局、綁定事件等上遥。
2. onStart()
這個方法在活動由不可見變?yōu)榭梢姷臅r候調(diào)用。
3. onResume()
這個方法在活動準備好和用戶進行交互的時候調(diào)用粉楚。此時的活動一定位于返回棧的棧頂睬棚,并且處于運行狀態(tài)解幼。
4. onPause()
這個方法在系統(tǒng)準備去啟動或者恢復(fù)另一個活動的時候調(diào)用。我們通常會在這個方法中將一些消耗 CPU 的資源釋放掉撵摆,以及保存一些關(guān)鍵數(shù)據(jù),但這個方法的執(zhí)行速度一定要快害晦,不然會影響到新的棧頂活動的使用。
5. onStop()
這個方法在活動完全不可見的時候調(diào)用壹瘟。它和 onPause() 方法的主要區(qū)別在于,如果啟動的新活動是一個對話框式的活動稻轨,那么 onPause() 方法會得到執(zhí)行,而 onStop() 方法并不會執(zhí)行殴俱。
6. onDestroy()
這個方法在活動被銷毀之前調(diào)用政冻,之后活動的狀態(tài)將變?yōu)殇N毀狀態(tài)线欲。
7. onRestart()
這個方法在活動由停止狀態(tài)變?yōu)檫\行狀態(tài)之前調(diào)用明场,也就是活動被重新啟動了李丰。
以上七個方法中除了onRestart()方法苦锨,其他都是兩兩相對的趴泌,從而又可以將活動分為三種生存期舟舒。
1. 完整生存期
活動在 onCreate() 方法和 onDestroy() 方法之間所經(jīng)歷的踱讨,就是完整生存期魏蔗。一般情況下痹筛,一個活動會在 onCreate() 方法中完成各種初始化操作莺治,而在 onDestroy() 方法中完成釋放內(nèi)存的操作。
2. 可見生存期
活動在 onStart() 方法和 onStop() 方法之間所經(jīng)歷的谣旁,就是可見生存期。在可見生存期內(nèi)榄审,活動對于用戶總是可見的砌们,即便有可能無法和用戶進行交互搁进。我們可以通過這兩個方法浪感,合理地管理那些對用戶可見的資源饼问。比如在 onStart() 方法中對資源進行加載影兽,而在 onStop() 方法中對資源進行釋放莱革,從而保證處于停止狀態(tài)的活動不會占用過多內(nèi)存峻堰。
3. 前臺生存期
活動在 onResume() 方法和 onPause() 方法之間所經(jīng)歷的盅视,就是前臺生存期捐名。在前臺生存期內(nèi)闹击,活動總是處于運行狀態(tài)的镶蹋,此時的活動是可以和用戶進行相互的赏半,我們平時看到和接觸最多的也這個狀態(tài)下的活動梅忌。
三除破、圖示
四牧氮、代碼
@Override
protected void onCreate() {
super.onCreate();
// 事件
}
@Override
protected void onStart() {
super.onStart();
// 事件
}
@Override
protected void onResume() {
super.onResume();
// 事件
}
@Override
protected void onPause() {
super.onPause();
// 事件
}
@Override
protected void onStop() {
super.onStop();
// 事件
}
@Override
protected void onDestroy() {
super.onDestroy();
// 事件
}
@Override
protected void onRestart() {
super.onRestart();
// 事件
}
五瑰枫、保存臨時數(shù)據(jù)
當一個活動進入到了停止狀態(tài),是有可能被系統(tǒng)回收的光坝。Activity 中還提供了一個 onSaveInstanceState() 回調(diào)方法尸诽,這個方法會保證一定在活動被回收之前調(diào)用盯另,因此我們可以通過這個方法來解決活動被回收時臨時數(shù)據(jù)得不到保存的問題性含。
1. 保存臨時數(shù)據(jù)
onSaveInstanceState() 方法會攜帶一個Bundle 類型的參數(shù)鸳惯,Bundle 提供了一系列的方法用于保存數(shù)據(jù)商蕴,鍵值對方式。如 putString()绪商、putInt() 等。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key", tempData);
}
2. 恢復(fù)臨時數(shù)據(jù)
onCreate()方法其實也有一個 Bundle 類型的參數(shù)格郁。這個參數(shù)在一般情況下都是 null腹殿,但是當活動被系統(tǒng)回收之前有通過 onSaveInstanceState() 方法來保存數(shù)據(jù)的話例书,這個參數(shù)就會帶有之前所保存的全部數(shù)據(jù)锣尉,只需要再通過相應(yīng)的取值方法將數(shù)據(jù)取出即可决采。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("data_key");
Log.d(TAG, tempData);
}
......
}
Intent 還可以結(jié)合 Bundle 一起用于傳遞數(shù)據(jù)的,首先可以把需要傳遞的數(shù)據(jù)都保存在 Bundle 對象中织狐,然后再將 Bundle 對象存放在 Intent 里。到了目標活動之后先從 Intent 中取出 Bundle移迫,再從Bundle中一一取出數(shù)據(jù)。