活動的生命周期

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ù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厨埋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捐顷,更是在濱河造成了極大的恐慌,老刑警劉巖迅涮,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異叮姑,居然都是意外死亡,警方通過查閱死者的電腦和手機传透,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門耘沼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朱盐,“玉大人群嗤,你說我怎么就攤上這事兵琳】衩兀” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵赃绊,是天一觀的道長。 經(jīng)常有香客問我碧查,道長运敢,這世上最難降的妖魔是什么忠售? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮稻扬,結(jié)果婚禮上卦方,老公的妹妹穿的比我還像新娘泰佳。我一直安慰自己盼砍,他們只是感情好逝她,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布浇坐。 她就那樣靜靜地躺著黔宛,像睡著了一般近刘。 火紅的嫁衣襯著肌膚如雪臀晃。 梳的紋絲不亂的頭發(fā)上觉渴,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天徽惋,我揣著相機與錄音案淋,去河邊找鬼险绘。 笑死哎迄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的漱挚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼旨涝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起慨默,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弧腥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體管搪,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年更鲁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澡为。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖媒至,靈堂內(nèi)的尸體忽然破棺而出顶别,到底是詐尸還是另有隱情拒啰,我是刑警寧澤驯绎,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布图呢,位于F島的核電站,受9級特大地震影響骗随,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸿染,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涨椒。 院中可真熱鬧摊鸡,春花似錦蚕冬、人聲如沸免猾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旁蔼。三九已至锨苏,卻和暖如春疙教,著一層夾襖步出監(jiān)牢的瞬間伞租,已是汗流浹背贞谓。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工葵诈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留裸弦,地道東北人驯击。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓烁兰,卻偏偏與公主長得像徊都,于是被迫代替她去往敵國和親沪斟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容