前面兩期我們學(xué)習(xí)了Activity的創(chuàng)建和注冊梁丘、以及啟動和關(guān)閉供填,也學(xué)會了重寫onCraete方法赡模,這些知識在實際開發(fā)中遠(yuǎn)遠(yuǎn)不夠向楼,還需要學(xué)習(xí)了解更多查吊。
生命周期就是一個對象從創(chuàng)建到銷毀的過程,每一個對象都有自己的生命周期湖蜕。同樣逻卖, Activity也具有相應(yīng)的生命周期。
一昭抒、Activity狀態(tài)
一個Android應(yīng)用程序往往包含多個Activity评也,當(dāng)Activity處于Android應(yīng)用中運行時炼杖,每個Activity的狀態(tài)都不一樣。Activity的活動狀態(tài)由Android以Activity棧的形式管理盗迟,當(dāng)前活動的Activity位于棧頂坤邪。隨著不同應(yīng)用的運行,每個Activity都有可能從活動狀態(tài)轉(zhuǎn)入非活動狀態(tài)罚缕,也可能從非活動狀態(tài)轉(zhuǎn)入活動狀態(tài)艇纺。
Activity的生命周期中一共有4種狀態(tài),分別如下:
1邮弹、運行狀態(tài)(Active or Running)
當(dāng)Activity在屏幕的最前端時黔衡,它處于Activity棧頂,是可見的腌乡、有焦點的盟劫,可以用來處理用戶的常見操作,如點擊与纽、雙擊侣签、長按事件等,這種狀態(tài)稱為運行狀態(tài)急迂,也叫活動狀態(tài)影所。
2、暫停狀態(tài)(Paused)
在某些情況下袋毙,Activity對用戶來說仍然是可見的型檀,但它不再擁有焦點冗尤,即用戶對它的操作是沒有實際意義的听盖。例如,當(dāng)最上面的Activity沒有完全覆蓋屏幕或者是透明的裂七,被覆蓋的Activity仍然對用戶可見皆看,并且存活(它保留著所有的狀態(tài)和成員信息并保持與Activity管理器的連接)。但當(dāng)內(nèi)存不足時背零,這個暫停狀態(tài)的Activity可能會被殺死腰吟。
3、停止?fàn)顟B(tài)(Stopped)
當(dāng)Activity完全不可見時徙瓶,它就處于停止?fàn)顟B(tài)毛雇,但仍然保留著當(dāng)前狀態(tài)和成員信息。然而這些對用戶來說都是不可見的侦镇,如果當(dāng)系統(tǒng)內(nèi)存不足時灵疮,這個Activity很容易被殺死。
4壳繁、銷毀狀態(tài)(Killed)
當(dāng)Activity運行結(jié)束震捣,或Activity所在的進(jìn)程結(jié)束時荔棉,這種狀態(tài)稱為銷毀狀態(tài),也叫非活動狀態(tài)蒿赢。這時Activity已從Activity棧中移除润樱,需要重新啟動才可以顯示和使用。當(dāng)系統(tǒng)內(nèi)存需要被用在其他地方的時候羡棵,一個停止?fàn)顟B(tài)的Activity被殺掉壹若。
另外當(dāng)Activity處于運行狀態(tài)時,Android會盡可能地保持它的運行皂冰,即使出現(xiàn)內(nèi)存不足的情況舌稀,Android也會先殺死棧底部的Activity,來確弊评蓿可見的Activity正常運行壁查。
關(guān)于Activity的這四種狀態(tài),是可以相互轉(zhuǎn)化的剔应,如下圖所示睡腿。
值得注意的時這四種狀態(tài)中,運行狀態(tài)和暫停狀態(tài)是可見的峻贮,停止?fàn)顟B(tài)和銷毀狀態(tài)是不可見的席怪。
二、?Activity生命周期
Activity從一種狀態(tài)轉(zhuǎn)變到另一種狀態(tài)時會觸發(fā)一些事件纤控,執(zhí)行一些回調(diào)方法來通知狀態(tài)的變化挂捻,這就是Activity的生命周期。
Activity的生命周期及其相關(guān)方法的回調(diào)船万,如下圖所示刻撒。
從上圖可以看到在Activity的生命周期中,有如下幾個方法被系統(tǒng)回調(diào)耿导。
onCreate(Bundle savedStatus):創(chuàng)建Activity時被回調(diào)声怔。該方法只會被調(diào)用一次。
onStart():啟動 Activity 時被回調(diào)舱呻。
onRestart():重新啟動 Activity 時被回調(diào)醋火。
onResume():恢復(fù) Activity 時被回調(diào)。在onStart()方法后一定會回調(diào) onResume()方法箱吕。
onPause():暫停 Activity 時被回調(diào)芥驳。
onStop():停止 Activity 時被回調(diào)。
onDestroy():銷毀 Activity 時被回調(diào)茬高。該方法只會被調(diào)用一次兆旬。
為了更好的掌握Activity生命周期及其方法,接下來通過一個實例來學(xué)習(xí)雅采,主要實現(xiàn)兩個Activity之間跳轉(zhuǎn)時生命周期方法變化的過程爵憎。
仍然使用上期創(chuàng)建的ActivitySample工程慨亲,為了便于代碼管理,這里新建一個activitylifecycle的Module宝鼓。該Module一共包含了2個Activity刑棵,并在AndroidManifest清單文件中配置兩個Activity。
其中第一個Activity的界面布局非常簡單愚铡,只包含2個按鈕蛉签,其中第一個按鈕的作用主要是啟動第二個Activity,第二個按鈕的作用是退出當(dāng)前Activity沥寥。第一個Activity對應(yīng)的布局文件activity_main.xml的代碼如下:
第二個Activity對應(yīng)的布局文件activity_second.xml的代碼如下:
第一個MainActivity類主要用于重寫Activity的生命周期方法碍舍,并在每個方法中打印出Log以便觀察,具體代碼如下所示:
為了觀察MainActivity停止?fàn)顟B(tài)時的生命周期邑雅,需要在當(dāng)前項目中創(chuàng)建第二個SecondActivity片橡,由于不需要對第二個Activity進(jìn)行界面操作,因此添加activity_second.xml文件即可不需要其他操作淮野。在第二個Activity中同樣實現(xiàn)Activity生命周期中的方法捧书,在每個方法中打印Log信息。
在AndroidManifest.xml文件中注冊已經(jīng)創(chuàng)建好的Activity骤星,即在清單文件中添加一個結(jié)點经瓷,指定Activity徑名洞难。
上述操作完成后運行程序舆吮,首先會顯示第一個Activity界面,如下圖所示队贱。
這時在Android Studio的LogCat窗口會打印MainActivity生命周期中的執(zhí)行方法色冀,如下圖所示:
從上圖可以看到,應(yīng)用程序啟動 MainActivity依次調(diào)用了 onCreate()露筒、onStart()呐伞、onResume()敌卓,這個順序是第一個Activity從創(chuàng)建到顯示在前臺到用戶可點擊的過程慎式。
接下來單擊第一個按鈕啟動第二個Activity。當(dāng)?shù)谝粋€界面跳轉(zhuǎn)到第二個界面時趟径,LogCat 窗口會打印MainActivity和SecondActivity生命周期中的執(zhí)行方法瘪吏,如下圖所示:
從上圖可以看到,當(dāng)跳轉(zhuǎn)到第二個界面時蜗巧,MainActivity首先失去焦點執(zhí)行了onPause()方法掌眠,然后SecondActivity依次執(zhí)行了onCreate()、onStart()幕屹、onResume()方法從創(chuàng)建到前臺可見蓝丙, 這時 MainActivity執(zhí)行了onStop()方法级遭。
現(xiàn)在再觀察一下從第二個Activity按返回鍵回到第一個Activity生命周期的LogCat 信息,如下圖所示:
從上圖可以看到渺尘,單擊返回鍵之后挫鸽,SecondActivity同樣先執(zhí)行了onPause()方法,然后 MainActivity執(zhí)行了 onRestart()鸥跟、onStart()丢郊、onResume()方法,隨后SecondActivity才徹底關(guān)閉医咨,執(zhí)行 了 onStop()枫匾、onDestory()。在 MainActivity打開 SecondActivity時拟淮,MainActivity并沒有執(zhí) onDestory()方法而是執(zhí)行了 onStop()方法干茉。因此,從 SecondActivity返回到 MainActivity時很泊,MainActivity執(zhí)行了 onRestart() 方法等脂。
單擊退出Activity按鈕,MainActivity將會結(jié)束自己撑蚌,并且可以在LogCat 窗口看到如下圖所示的輸出:
從該示例可以看到上遥,各生命周期方法的調(diào)用完全符合前面所講。
將Activity的生命周期方法和Activity的四種狀態(tài)結(jié)合起來争涌,用另一種方式表現(xiàn)出來粉楚,可以得到下面的示意圖。
關(guān)于Activity的生命周期方法就先學(xué)到這里亮垫,下期再繼續(xù)學(xué)習(xí)其他有關(guān)Activity的內(nèi)容模软。
今天就先到這里,如果有問題歡迎留言一起探討饮潦,也歡迎加入Android零基礎(chǔ)入門技術(shù)討論微信群燃异,共同成長!
如果該系列分享對你有幫助继蜡,就動動手指關(guān)注回俐、點贊、留言吧稀并,你的互動就是對我最大的鼓勵仅颇!
此文章版權(quán)為微信公眾號分享達(dá)人秀(ShareExpert)——鑫鱻所有,若需轉(zhuǎn)載請聯(lián)系作者授權(quán)碘举,特此聲明忘瓦!
往期總結(jié)回顧:
Android零基礎(chǔ)入門第1節(jié):Android的前世今生
Android零基礎(chǔ)入門第2節(jié):Android 系統(tǒng)架構(gòu)和應(yīng)用組件那些事
Android零基礎(chǔ)入門第3節(jié):帶你一起來聊一聊Android開發(fā)環(huán)境
Android零基礎(chǔ)入門第4節(jié):正確安裝和配置JDK, 高富帥養(yǎng)成第一招
Android零基礎(chǔ)入門第5節(jié):善用ADT Bundle, 輕松邂逅女神
Android零基礎(chǔ)入門第6節(jié):配置優(yōu)化SDK Manager, 正式約會女神
Android零基礎(chǔ)入門第7節(jié):搞定Android模擬器,開啟甜蜜之旅
Android零基礎(chǔ)入門第8節(jié):HelloWorld引颈,我的第一趟旅程出發(fā)點
Android零基礎(chǔ)入門第9節(jié):Android應(yīng)用實戰(zhàn)耕皮,不懂代碼也可以開發(fā)
Android零基礎(chǔ)入門第10節(jié):開發(fā)IDE大升級境蜕,終于迎來了Android Studio
Android零基礎(chǔ)入門第11節(jié):簡單幾步帶你飛,運行Android Studio工程
Android零基礎(chǔ)入門第12節(jié):熟悉Android Studio界面凌停,開始裝逼賣萌
Android零基礎(chǔ)入門第13節(jié):Android Studio個性化配置汽摹,打造開發(fā)利器
Android零基礎(chǔ)入門第14節(jié):使用高速Genymotion,跨入火箭時代
Android零基礎(chǔ)入門第15節(jié):掌握Android Studio項目結(jié)構(gòu)苦锨,揚(yáng)帆起航
Android零基礎(chǔ)入門第16節(jié):Android用戶界面開發(fā)概述
Android零基礎(chǔ)入門第17節(jié):文本框TextView
Android零基礎(chǔ)入門第18節(jié):輸入框EditText
Android零基礎(chǔ)入門第19節(jié):按鈕Button
Android零基礎(chǔ)入門第20節(jié):復(fù)選框CheckBox和單選按鈕RadioButton
Android零基礎(chǔ)入門第21節(jié):開關(guān)組件ToggleButton和Switch
Android零基礎(chǔ)入門第22節(jié):圖像視圖ImageView
Android零基礎(chǔ)入門第23節(jié):圖像按鈕ImageButton和縮放按鈕ZoomButton
Android零基礎(chǔ)入門第24節(jié):自定義View簡單使用逼泣,打造屬于你的控件
Android零基礎(chǔ)入門第25節(jié):簡單且最常用的LinearLayout線性布局
Android零基礎(chǔ)入門第26節(jié):兩種對齊方式舟舒,layout_gravity和gravity大不同
Android零基礎(chǔ)入門第27節(jié):正確使用padding和margin
Android零基礎(chǔ)入門第28節(jié):輕松掌握RelativeLayout相對布局
Android零基礎(chǔ)入門第29節(jié):善用TableLayout表格布局
Android零基礎(chǔ)入門第30節(jié):兩分鐘掌握FrameLayout幀布局
Android零基礎(chǔ)入門第31節(jié):少用的AbsoluteLayout絕對布局
Android零基礎(chǔ)入門第32節(jié):新推出的GridLayout網(wǎng)格布局
Android零基礎(chǔ)入門第33節(jié):Android事件處理概述
Android零基礎(chǔ)入門第34節(jié):Android中基于監(jiān)聽的事件處理
Android零基礎(chǔ)入門第35節(jié):Android中基于回調(diào)的事件處理
Android零基礎(chǔ)入門第36節(jié):Android系統(tǒng)事件的處理
Android零基礎(chǔ)入門第37節(jié):初識ListView
Android零基礎(chǔ)入門第38節(jié):初識Adapter
Android零基礎(chǔ)入門第39節(jié):ListActivity和自定義列表項
Android零基礎(chǔ)入門第40節(jié):自定義ArrayAdapter
Android零基礎(chǔ)入門第41節(jié):使用SimpleAdapter
Android零基礎(chǔ)入門第42節(jié):自定義BaseAdapter
Android零基礎(chǔ)入門第43節(jié):ListView優(yōu)化和列表首尾使用
Android零基礎(chǔ)入門第44節(jié):ListView數(shù)據(jù)動態(tài)更新
Android零基礎(chǔ)入門第45節(jié):網(wǎng)格視圖GridView
Android零基礎(chǔ)入門第46節(jié):列表選項框Spinner
Android零基礎(chǔ)入門第47節(jié):自動完成文本框AutoCompleteTextView
Android零基礎(chǔ)入門第48節(jié):可折疊列表ExpandableListView
Android零基礎(chǔ)入門第49節(jié):AdapterViewFlipper圖片輪播
Android零基礎(chǔ)入門第50節(jié):StackView卡片堆疊
Android零基礎(chǔ)入門第51節(jié):進(jìn)度條ProgressBar
Android零基礎(chǔ)入門第52節(jié):自定義ProgressBar炫酷進(jìn)度條
Android零基礎(chǔ)入門第53節(jié):拖動條SeekBar和星級評分條RatingBar
Android零基礎(chǔ)入門第54節(jié):視圖切換組件ViewSwitcher
Android零基礎(chǔ)入門第55節(jié):ImageSwitcher和TextSwitcher
Android零基礎(chǔ)入門第56節(jié):翻轉(zhuǎn)視圖ViewFlipper
Android零基礎(chǔ)入門第57節(jié):DatePicker和TimePicker選擇器
Android零基礎(chǔ)入門第58節(jié):數(shù)值選擇器NumberPicker
Android零基礎(chǔ)入門第59節(jié):常用三大Clock時鐘組件
Android零基礎(chǔ)入門第60節(jié):日歷視圖CalendarView和定時器Chronometer
Android零基礎(chǔ)入門第61節(jié):滾動視圖ScrollView
Android零基礎(chǔ)入門第62節(jié):搜索框組件SearchView
Android零基礎(chǔ)入門第63節(jié):值得借鑒學(xué)習(xí)的選項卡TabHost
Android零基礎(chǔ)入門第64節(jié):揭開RecyclerView廬山真面目
Android零基礎(chǔ)入門第65節(jié):RecyclerView分割線開發(fā)技巧
Android零基礎(chǔ)入門第66節(jié):RecyclerView點擊事件處理
Android零基礎(chǔ)入門第67節(jié):RecyclerView數(shù)據(jù)動態(tài)更新
Android零基礎(chǔ)入門第68節(jié):RecyclerView添加首尾視圖
Android零基礎(chǔ)入門第69節(jié):ViewPager快速實現(xiàn)引導(dǎo)頁
Android零基礎(chǔ)入門第70節(jié):ViewPager打造TabHost效果
Android零基礎(chǔ)入門第71節(jié):CardView簡單實現(xiàn)卡片式布局
Android零基礎(chǔ)入門第72節(jié):SwipeRefreshLayout下拉刷新
Android零基礎(chǔ)入門第73節(jié):Activity創(chuàng)建和配置
Android零基礎(chǔ)入門第74節(jié):Activity啟動和關(guān)閉