色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > activity生命周期詳解,大牛教會你

activity生命周期詳解,大牛教會你 時間:2018-07-12      來源:未知

 Activity和BroadcastReceiver ,Service ,contentprovider 并稱為Android 四大組件,對于他們來說構成了Android應用的骨架,缺一不可,對于Activity來說,更是他們之中的重中之重。

首先學習Activity,需要先了解一下他的作用:

在日常應用中Activity是與用戶交互的接口,它提供了一個用戶完成相關操作的窗口。當我們在開發中創建Activity后,通過調用setContentView(View)方法來給該Activity指定一個布局界面,而這個界面就是提供給用戶交互的接口。Android系統中是通過Activity棧的方式來管理Activity的,而Activity自身則是通過生命周期的方法來管理的自己的創建與銷毀,既然如此,現在我們就來看看Activity生命周期是如何運作的。

其次對于Activity來說是有一個運行狀態的,就好比當我們的頁面處于屏幕的最前端,處于陰影狀態,處于后臺中等等又可細分為好幾種狀態:

Active/Running:

Activity處于活動狀態,此時Activity處于棧頂,是可見狀態,可與用戶進行交互。

Paused:

當Activity失去焦點時,或被一個新的非全屏的Activity,或被一個透明的Activity放置在棧頂時,Activity就轉化為Paused狀態。但我們需要明白,此時Activity只是失去了與用戶交互的能力,其所有的狀態信息及其成員變量都還存在,只有在系統內存緊張的情況下,才有可能被系統回收掉。

Stopped:

當一個Activity被另一個Activity完全覆蓋時,被覆蓋的Activity就會進入Stopped狀態,此時它不再可見,但是跟Paused狀態一樣保持著其所有狀態信息及其成員變量。

Killed:

當Activity被系統回收掉時,Activity就處于Killed狀態。

Activity會在以上四種形態中相互切換,至于如何切換,這因用戶的操作不同而異。

了解了Activity的4種形態后,我們就來聊聊Activity的生命周期。

相信大部分人對這種流程圖并不陌生,嗯,我們下面主要聊得話題就是圍繞這張流程圖了。我們先有個大概印象,后面我們分析完后再回來看,就相當清晰了。

所謂的典型的生命周期就是在有用戶參與的情況下,Activity經歷從創建,運行,停止,銷毀等正常的生命周期過程。我們這里先來介紹一下幾個主要方法的調用時機,然后再通過代碼層面來驗證其調用流程。

onCreate : 該方法是在Activity被創建時回調,它是生命周期第一個調用的方法,我們在創建Activity時一般都需要重寫該方法,然后在該方法中做一些初始化的操作,如通過setContentView設置界面布局的資源,初始化所需要的組件信息等。

onStart : 此方法被回調時表示Activity正在啟動,此時Activity已處于可見狀態,只是還沒有在前臺顯示,因此無法與用戶進行交互。可以簡單理解為Activity已顯示而我們無法看見擺了。

onResume : 當此方法回調時,則說明Activity已在前臺可見,可與用戶交互了(處于前面所說的Active/Running形態),onResume方法與onStart的相同點是兩者都表示Activity可見,只不過onStart回調時Activity還是后臺無法與用戶交互,而onResume則已顯示在前臺,可與用戶交互。當然從流程圖,我們也可以看出當Activity停止后(onPause方法和onStop方法被調用),重新回到前臺時也會調用onResume方法,因此我們也可以在onResume方法中初始化一些資源,比如重新初始化在onPause或者onStop方法中釋放的資源。

onPause : 此方法被回調時則表示Activity正在停止(Paused形態),一般情況下onStop方法會緊接著被回調。但通過流程圖我們還可以看到一種情況是onPause方法執行后直接執行了onResume方法,這屬于比較極端的現象了,這可能是用戶操作使當前Activity退居后臺后又迅速地再回到到當前的Activity,此時onResume方法就會被回調。當然,在onPause方法中我們可以做一些數據存儲或者動畫停止或者資源回收的操作,但是不能太耗時,因為這可能會影響到新的Activity的顯示——onPause方法執行完成后,新Activity的onResume方法才會被執行。

onStop : 一般在onPause方法執行完成直接執行,表示Activity即將停止或者完全被覆蓋(Stopped形態),此時Activity不可見,僅在后臺運行。同樣地,在onStop方法可以做一些資源釋放的操作(不能太耗時)。

onRestart :表示Activity正在重新啟動,當Activity由不可見變為可見狀態時,該方法被回調。這種情況一般是用戶打開了一個新的Activity時,當前的Activity就會被暫停(onPause和onStop被執行了),接著又回到當前Activity頁面時,onRestart方法就會被回調。

onDestroy :此時Activity正在被銷毀,也是生命周期最后一個執行的方法,一般我們可以在此方法中做一些回收工作和最終的資源釋放。

下面我們通過程序來驗證上面流程中的幾種比較重要的情況,同時觀察生命周期方法的回調時機。

說完生命周期,現在我們在來說說加載模式

Standard:

默認模式,可以不用寫配置。在這個模式下,都會默認創建一個新的實例。因此,在這種模式下,可以有多個相同的實例,也允許多個相同Activity疊加。

例如:

若我有一個Activity名為A1, 上面有一個按鈕可跳轉到A1。那么如果我點擊按鈕,便會新啟一個Activity A1疊在剛才的A1之上,再點擊,又會再新啟一個在它之上……

點back鍵會依照棧順序依次退出。

singleTop

可以有多個實例,但是不允許多個相同Activity疊加。即,如果Activity在棧頂的時候,啟動相同的Activity,不會創建新的實例,而會調用其onNewIntent方法。

例如:

若我有兩個Activity名為B1,B2,兩個Activity內容功能完全相同,都有兩個按鈕可以跳到B1或者B2,唯一不同的是B1為standard,B2為singleTop。

若我意圖打開的順序為B1->B2->B2,則實際打開的順序為B1->B2(后一次意圖打開B2,實際只調用了前一個的onNewIntent方法)

若我意圖打開的順序為B1->B2->B1->B2,則實際打開的順序與意圖的一致,為B1->B2->B1->B2。

singleTask

只有一個實例。在同一個應用程序中啟動他的時候,若Activity不存在,則會在當前task創建一個新的實例,若存在,則會把task中在其之上的其它Activity destory掉并調用它的onNewIntent方法。

如果是在別的應用程序中啟動它,則會新建一個task,并在該task中啟動這個Activity,singleTask允許別的Activity與其在一個task中共存,也就是說,如果我在這個singleTask的實例中再打開新的Activity,這個新的Activity還是會在singleTask的實例的task中。

例如:

若我的應用程序中有三個Activity,C1,C2,C3,三個Activity可互相啟動,其中C2為singleTask模式,那么,無論我在這個程序中如何點擊啟動,如:C1->C2->C3->C2->C3->C1-C2,C1,C3可能存在多個實例,但是C2只會存在一個,并且這三個Activity都在同一個task里面。

但是C1->C2->C3->C2->C3->C1-C2,這樣的操作過程實際應該是如下這樣的,因為singleTask會把task中在其之上的其它Activity destory掉。

操作:C1->C2 C1->C2->C3 C1->C2->C3->C2 C1->C2->C3->C2->C3->C1 C1->C2->C3->C2->C3->C1-C2

實際:C1->C2 C1->C2->C3 C1->C2 C1->C2->C3->C1 C1->C2

若是別的應用程序打開C2,則會新啟一個task。

如別的應用Other中有一個activity,taskId為200,從它打開C2,則C2的taskIdI不會為200,例如C2的taskId為201,那么再從C2打開C1、C3,則C2、C3的taskId仍為201。

注意:如果此時你點擊home,然后再打開Other,發現這時顯示的肯定會是Other應用中的內容,而不會是我們應用中的C1 C2 C3中的其中一個。

singleInstance

只有一個實例,并且這個實例獨立運行在一個task中,這個task只有這個實例,不允許有別的Activity存在。

例如:

程序有三個ActivityD1,D2,D3,三個Activity可互相啟動,其中D2為singleInstance模式。那么程序從D1開始運行,假設D1的taskId為200,那么從D1啟動D2時,D2會新啟動一個task,即D2與D1不在一個task中運行。假設D2的taskId為201,再從D2啟動D3時,D3的taskId為200,也就是說它被壓到了D1啟動的任務棧中。

若是在別的應用程序打開D2,假設Other的taskId為200,打開D2,D2會新建一個task運行,假設它的taskId為201,那么如果這時再從D2啟動D1或者D3,則又會再創建一個task,因此,若操作步驟為other->D2->D1,這過程就涉及到了3個task了。

上一篇:busybox文件系統制作步驟,帶你快速學習

下一篇:fread()函數語法要點總結,附帶程序實例

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 四虎成人免费影院 | 九九婷婷 | 中文字幕有码无码人妻AV蜜桃 | 永久免费AV无码网站喷水 | 无码永久成人免费视频 | av在线观看网址 | 中文无码日韩欧免费视频 | 国产黄a三级三级三级70年后 | 最新a片免费网址 | 亚州日韩精品AV片无码中文 | 在线观看日本一区 | 特黄特色大片免费播放 | 国产亚洲小视频线播放 | 少妇午夜福利一区二区 | 啪啪tv网站免费入口 | 啦啦啦啦WWW日本在线观看 | 国产亚洲精品久久久999功能介绍 | 国产人成高清在线视频99最全资源 | 人摸人人人澡人人超碰97 | 久久午夜伦鲁片免费无码 | 性色AV一区二区三区无码 | 亚洲精品无码一区二区三区四虎 | 最新国产精品无码 | 蜜桃色欲AV久久无码精品 | 国产嫖妓一区二区三区无码 | 国产又爽又黄又无遮挡的激情视频 | 国产噜噜噜噜久久久久久久久 | 成 人 网 站不卡在线观看 | 欧美性猛交xxxx黑人 | 亚洲国产精品成人久久蜜臀 | 亚洲日韩中文字幕手机在线 | 欲色欲色天天天WWW 亚洲日韩欧美一区二区三区 | 永夜星河免费在线观看 | 色老久久精品偷偷鲁 | 亚洲综合无码日韩 | 国产香蕉在线观看 | 99久久久国产精品免费 | 久久水蜜桃视频 | 日本护士体内SHE精2╳╳╳ | 五十路熟妇高熟无码视频 | 精品人妻无码一区二区三区不卡 |