簡述Android Activity

目錄:
[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、生命周期的三種分類

  1. 完整生命周期(Entire lifetime)
    onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy()
  2. 可見生命周期(Visible lifetime)
    onStart() -> onResume() -> onPause() -> onStop()
  3. 前臺生命周期(Foreground lifetime)
    onResume() -> onPause()

3叉弦、生命周期方法啟動順序

  1. 常規(guī)啟動
    onCreate()—>onStart()—>onResume()
  2. 當另一個Activity啟動時
    Activity_1 onPause() —>
    Activity_2 onCreate() —> onStart() —> onResume() —>
    Activity_1 onStop()
  3. 當返回到之前Activity時
    Activity_2 onPause() —>
    Activity_1 onRestart() —> onStart() —> onResume() —>
    Activity_2 onStop() —> onDestroy()

4丐一、生命周期方法銷毀順序

  1. 異常銷毀
    onPause() —> <Process Killed>
  2. 異常銷毀
    onPause() —> onStop() —> <Process Killed>
  3. 正常銷毀
    onPause() —> onStop() —> onDestroy()

5、Activity的四種狀態(tài)

  1. 活動狀態(tài)(Runing)
    處于棧頂淹冰,處于可見并可和用戶交互的激活狀態(tài)库车。
    活動狀態(tài)觸發(fā)的函數(shù)及順序為:
    onCreate() —> onStart() —> onResume()。
  2. 暫停狀態(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()正罢。
  3. 停止狀態(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()履怯。
  4. 死亡狀態(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的加載模式

  • 設置加載模式的兩種方法

    1. Intent對象中設置的Flag;
    2. AndroidManifest.xml中進行設置乒疏,launchMode屬性额衙。
  • 四種加載模式

    1. standard
      默認模式,可以不用寫配置怕吴∏喜啵可以有多個相同的實例,也允許多個相同Activity疊加转绷。
    2. singleTop
      可以有多個相同的實例伟件,但不允許多個相同Activity疊加。即议经,如果Activity在棧頂?shù)臅r候锋爪,啟動相同的Activity,不會創(chuàng)建新的實例爸业,而會調用其onNewIntent方法。
    3. singleTask
      只有一個實例亏镰。啟動時候扯旷,若Activity不存在,則會在當前task創(chuàng)建一個新的實例索抓,若存在钧忽,則會把task中在其之上的其它Activity destory掉并調用它的onNewIntent方法。如果在別的應用程序中啟動它逼肯,則會新建一個task耸黑,并在該task中啟動這個Activity,并且允許別的Activity與其在一個task中共存篮幢。
    4. singleInstance
      只有一個實例大刊,并且這個實例獨立運行在一個task中,這個task只有這個實例三椿,不允許有別的Activity存在缺菌。

9葫辐、Activity的棧管理

鏈接1
鏈接2

10、典型問題及解決方案

  • 屏幕旋轉Activity銷毀重建
    1. 不設置Activity的android:configChanges時伴郁,切屏會重新調用各個生命周期耿战,切橫屏時會執(zhí)行一次,切豎屏時會執(zhí)行兩次焊傅。
    2. 設置Activity的android:configChanges=”orientation”時剂陡,切屏還是會重新調用各個生命周期,切橫狐胎、豎屏時只會執(zhí)行一次鸭栖。
    3. 在Android3.2之前,設置Activity的android:configChanges=”orientation|keyboardHidden”時顽爹,切屏不會重新調用各個生命周期纤泵,只會執(zhí)行onConfigurationChanged方法。但在Android3.2及其之后镜粤,仍會重新調用各個生命周期一次捏题,因為screen size也開始跟著設備的橫豎切換而改變。
    4. Android3.2及其之后肉渴,設置Activity的android:configChanges=”orientation|keyboardHidden|screenSize“公荧,切屏不會重新調用各個生命周期,只會執(zhí)行onConfigurationChanged方法同规。
    5. 解決方案鏈接
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末循狰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子券勺,更是在濱河造成了極大的恐慌绪钥,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件关炼,死亡現(xiàn)場離奇詭異程腹,居然都是意外死亡,警方通過查閱死者的電腦和手機儒拂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門寸潦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人社痛,你說我怎么就攤上這事见转。” “怎么了蒜哀?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵斩箫,是天一觀的道長。 經(jīng)常有香客問我,道長校焦,這世上最難降的妖魔是什么赊抖? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮寨典,結果婚禮上氛雪,老公的妹妹穿的比我還像新娘。我一直安慰自己耸成,他們只是感情好报亩,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著井氢,像睡著了一般弦追。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上花竞,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天劲件,我揣著相機與錄音,去河邊找鬼约急。 笑死零远,一個胖子當著我的面吹牛,可吹牛的內容都是我干的厌蔽。 我是一名探鬼主播牵辣,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奴饮!你這毒婦竟也來了纬向?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤戴卜,失蹤者是張志新(化名)和其女友劉穎逾条,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體投剥,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡师脂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了薇缅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡攒磨,死狀恐怖泳桦,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情娩缰,我是刑警寧澤灸撰,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響浮毯,放射性物質發(fā)生泄漏完疫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一债蓝、第九天 我趴在偏房一處隱蔽的房頂上張望壳鹤。 院中可真熱鬧,春花似錦饰迹、人聲如沸芳誓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锹淌。三九已至,卻和暖如春赠制,著一層夾襖步出監(jiān)牢的瞬間赂摆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工钟些, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留烟号,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓厘唾,卻偏偏與公主長得像褥符,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抚垃,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內容

  • Activity https://developer.android.com/guide/components/a...
    XLsn0w閱讀 707評論 0 4
  • 本文出自 “阿敏其人” 簡書博客鹤树,轉載或引用請注明出處铣焊。 一、前言 Activity罕伯,安卓四大組件之一曲伊。 每個 A...
    阿敏其人閱讀 9,109評論 8 88
  • 這是一篇算不上書評的書評∽匪或者坟募,我只想跟你談談這本書。 國慶節(jié)的最后一天邑狸,我請了一天假跑到新華書店(我們國慶不放假...
    我的老師是只貓閱讀 425評論 6 5
  • 讀《塵埃落定》有感 最近讀了一本書《塵埃落定》懈糯,開始毫無興趣,但聽說好評不斷单雾,且是茅盾文學獎得主赚哗,忍不住好奇...
    王櫟涵閱讀 196評論 0 2
  • 1. 云海的邊緣沒有光她紫,退潮時,會露出一片深藍色的海岸屿储,這是一片環(huán)形的海岸贿讹,從一個地方出發(fā)沿岸行走,走上一夜就會返...
    小萘閱讀 386評論 2 9