Android物語:Android四大組件

Android四大組件及其作用

  • 活動(activity)

Activity可以看成是安卓系統(tǒng)的根本,在這個根本上才可以進行其他的工作珊搀,因為在安卓系統(tǒng)里運行的所有的程序,它的流程都必須在【活動】中運行尾菇,所有他是最基本的模塊境析。它的作用是一個框架或頁面,每個程序會有多個【活動】組成派诬。

  • 服務(wù)(Service)

Service是安卓里非常很重要的組件劳淆,它的地位和優(yōu)先級別是與活動相似的,不過Service不能夠自己運行默赂,它只能在安卓的后臺運行沛鸵。它的作用就是與安卓的其他逐漸進行交互,舉個簡單例子:當(dāng)我們打開手機上音樂播放器并將它放到后臺缆八,此時播放的音樂就是由Service在負(fù)責(zé)控制曲掰。

  • 廣播接收器(BroadcastReceiver)

在安卓系統(tǒng)中,廣播接收器并不是直接就可以看到的奈辰,它是程序之間傳遞信息時的一種機制栏妖,作用就是接收或者發(fā)送通知。通俗的來說廣播接收器更像是一種傳遞組件奖恰,它能夠?qū)⑿畔⒔邮盏踔海踔吝€可以對它進行過濾然后進行響應(yīng)宛裕。

  • 內(nèi)容提供商(Content Provider)

內(nèi)容提供商這個組件是專門為第三方應(yīng)用而設(shè)計的,它非常的靈活论泛,而且相當(dāng)重要揩尸,它會為所有的應(yīng)用準(zhǔn)備一個內(nèi)容窗口,并且保留數(shù)據(jù)庫屁奏、文件岩榆,作用就是我們在使用這些第三方軟件的時候,可以有效的訪問了袁,并且保護里面的數(shù)據(jù)朗恳。

Activity

Activity的生命周期

image.png

Activity的簡單生命周期流程為:
onCreate();→onStart();【注:此時Activity處于不可見狀態(tài)】
→onResume();【注:此時Activity處于運行狀態(tài)】
→onPause();【注:此時Activity處于暫停狀態(tài)】
→onStop();【注:此時Activity處于停滯狀態(tài)】
→onDestroy();【注:調(diào)用了此方法后Activity生命周期結(jié)束】
其中當(dāng)Activity正在重新啟動的時候,從不可見變?yōu)榭梢姷臅r候载绿,會調(diào)用到onRestart();也就是說一個Activity包含七個生命周期流程

  • Activity被其他Activity覆蓋其上粥诫,系統(tǒng)會調(diào)用onPause()方法,暫停當(dāng)前Activity的執(zhí)行崭庸,若用戶取消了覆蓋怀浆,系統(tǒng)會調(diào)用onResume()方法,重新進入到運行狀態(tài)怕享。

  • Activity跳轉(zhuǎn)到了新的Activity界面或者被后臺了或者鎖屏?xí)r执赡,系統(tǒng)會調(diào)用onPause();然后調(diào)用onStop();使Activity進入到停滯狀態(tài),如果重新回到了該Activity界面(上一個Activity或者從后臺變?yōu)榱饲芭_時或者解開鎖屏?xí)r)函筋,系統(tǒng)會調(diào)用onRestart();再調(diào)用onStart();最后調(diào)用onResume()方法使該Activity進入到運行狀態(tài)

  • 當(dāng)用戶退出Activity時會調(diào)用onPause();然后調(diào)用onStop();最后調(diào)用onDestory();結(jié)束Activity生命周期

  • 當(dāng)Activity中彈出dialog對話框的時候沙合,Activity不會調(diào)用onPause();只有當(dāng)Activity啟動了dialog風(fēng)格的Activity時才會調(diào)用

  • 當(dāng)Activity是由于異常情況下終止的,系統(tǒng)會調(diào)用onSaveInstance來保存當(dāng)前Activity狀態(tài)跌帐,這個方法調(diào)用的時機是在onStop之前的首懈,當(dāng)Activity重新創(chuàng)建后,系統(tǒng)會調(diào)用onRestoreInstanceState,并且把Activity銷毀時的onSaveInstanceState方法保存的bundle對象作為參數(shù)同時傳遞給onRestoreInstanceState和onCreate方法

Activity的四種啟動模式
Activity有四種啟動模式谨敛,我們可以在清單文件的<Activity節(jié)點下通過android:launchMode來進行配置

  • standard模式:在這種模式下究履,activity默認(rèn)會進入啟動它的activity所屬的任務(wù)棧中。這也是默認(rèn)的一種模式
  • singleTop模式:棧頂復(fù)用模式脸狸。如果新activity位于任務(wù)棧的棧頂?shù)臅r候最仑,activity不會被重新創(chuàng)建,同時它的onNewIntent方法會被回調(diào)炊甲。
  • singleTask模式:棧內(nèi)復(fù)用模式泥彤。只要activity在一個棧中存在,那么多次啟動此activity不會被重新創(chuàng)建單例卿啡,系統(tǒng)會回調(diào)onNewIntent吟吝。這種模式可以稱為單例模式,只會存在一種牵囤,有則直接從棧中調(diào)用爸黄,沒有則創(chuàng)建并且壓入棧中
  • singleInstance模式:單實例模式。這種模式的activity只能單獨地位于一個任務(wù)棧中揭鳞,這種與singleTask有點類似炕贵,其實也是有則直接調(diào)用,沒有則創(chuàng)建并且放入棧中野崇,只不過singleTask是可以和其他的Activity放在同一個棧中称开,singleInstance則是只會將創(chuàng)建的Activity放在一個棧中,并且這個棧中只會有這一個Activity實例

Service

  • Service分為兩種乓梨,一種是Service(這一種是運行在主線程中的鳖轰,如果要執(zhí)行耗時操作,可在service中創(chuàng)建一個異步來執(zhí)行)扶镀,一種是IntentService(這是一種異步服務(wù)蕴侣,是繼承于Service的子類),所以推薦當(dāng)要執(zhí)行耗時操作時使用IntentService臭觉,如果不耗時昆雀,我們可以使用Service
  • Service 負(fù)責(zé)與UI無關(guān)的工作 【后臺】執(zhí)行的操作
    Android的后臺就是指,它的運行是完全不依賴UI的蝠筑。即使Activity被銷毀狞膘,或者程序被關(guān)閉,只要進程還在什乙,Service就可以繼續(xù)運行挽封。

Service的兩種啟動方式

  • 通過start方法開啟服務(wù)
  • 通過bind的方式啟動服務(wù)

Broadcast

android中的廣播就像我們平時說的電臺廣播,一個廣播可以有多個接受者臣镣,廣播機制是一個典型的發(fā)布-訂閱模式(觀察者模式)辅愿。廣播機制最大的特點就是發(fā)送方并不關(guān)心接受方是否接受或是如何處理數(shù)據(jù)的,這樣接收雙方完全解耦合退疫。

廣播機制主要包含三個要素渠缕,發(fā)送廣播的BroadCast 、接收廣播的BroadCastReceiver褒繁、用于傳遞信息的Intent亦鳞。

1.注冊方式

  • 靜態(tài)注冊 AndroidManifast.xml中,只要app在運行就一直能接收到廣播棒坏。

  • 動態(tài)注冊 在activity或service中注冊燕差,它們?nèi)舯讳N毀,廣播也就接受不到了坝冕。

2.生命周期
onReceive()
生命周期只有十秒左右徒探,如果在 onReceive() 內(nèi)做超過十秒內(nèi)的事情,就會報ANR 程序無響應(yīng)的錯誤信息喂窟。

如果需要完成一項比較耗時的工作 , 應(yīng)該通過發(fā)送 Intent 給 Service, 由Service 來完成测暗。

不要在廣播接受者中創(chuàng)建子線程央串,因為它的生命周期非常短,子線程可能還沒有結(jié)束BroadcastReceiver 就先結(jié)束了碗啄,子線程相應(yīng)也就結(jié)束了质和。

3.類型
Android廣播主要分為普通廣播、有序廣播稚字、本地廣播饲宿、 Sticky廣播。

  • 普通廣播:
    sendBroadcast(Intent intent)發(fā)送廣播
    優(yōu)點:效率高
    缺點:一個接受者不能將處理結(jié)果傳遞給下一個接受者胆描,并且無法終止廣播的傳播瘫想。完全異步,接收器的執(zhí)行順序不確定昌讲。

  • 有序廣播:
    sendOrderedBroadcast(intent, receiverPermission)
    缺點:效率低
    優(yōu)點:按優(yōu)先級別由高到低依次傳播国夜,高級別的或同級別先接收到廣播的可以通過abortBroadcast()方法截斷廣播使其他的接收者無法收到該廣播。也可以通過setResultExtras(bundle)方法將處理結(jié)果存入bundle中短绸,下一個接受可以通過getResultExtra(true) 方法獲取上一個接受者傳來的bundle數(shù)據(jù)支竹。

  • 本地廣播:
    LocalBroadcastManager 普通廣播和有序廣播都是全局廣播,所有應(yīng)用程序都可以接收到鸠按,這樣就會帶來安全隱患礼搁。但是有的時候我們并不需要把自己的應(yīng)用內(nèi)的信息廣播給所有應(yīng)用,而只是在進程內(nèi)使用目尖。所以使用本地廣播就能實現(xiàn)限于應(yīng)用內(nèi)的廣播薛训。本地廣播和普通廣播只是操作的類不一樣邀桑,其他接口都類似,只需把從前的registerReceiver()變成LocalBroadcastManager.getInstance(context).registerReceiver()。替換成本比較低锄码,為了程序的安全性局齿,建議在不需要其他進程接收廣播的情況下使用本地廣播罢浇。

  • Sticky廣播:
    sendStickyBroadcast 用此函數(shù)發(fā)送的廣播會一直滯留讼积,當(dāng)有匹配此廣播的廣播接收器被注冊后,該廣播接收器就會收到此條廣播烦衣。(記得在AndroidManifest 里注冊BROADCAST_STICKY權(quán)限)歹河。sendStickyBroadcast只保留最后一條廣播,并且一直保留下去花吟,這樣即使已經(jīng)有廣播接收器處理了該廣播秸歧,當(dāng)再有匹配的廣播接收器被注冊時,次廣播仍然會被接收衅澈。如果你只想處理一遍該廣播键菱,可以通過removeStickyBroadcast()函數(shù)實現(xiàn)。

ContentProvider

  • ContentProvider 應(yīng)用間數(shù)據(jù)共享 使用其對外共享數(shù)據(jù)的好處是統(tǒng)一了數(shù)據(jù)的訪問方式今布,實際上是對SQliteOpenHelper 的進一步封裝经备,通過Uri地址映射來判斷選擇需要操作數(shù)據(jù)庫中的哪個表拭抬,并且進行增刪改查處理。

  • Content Provider 內(nèi)容提供者侵蒙,用于對外提供數(shù)據(jù)

  • Content Resolver 內(nèi)容解析者玖喘,用戶獲取提供者提供的數(shù)據(jù)(外部應(yīng)用通過resolver來訪問provider)

  • Content Observer 內(nèi)容監(jiān)聽器,可以監(jiān)聽數(shù)據(jù)的改變狀態(tài)

使用Content Provider對外共享數(shù)據(jù)的步驟:

定義一個類繼承Content Provider,然后重寫query蘑志、insert、delete贬派、update方法等

附錄
參考文檔:http://www.reibang.com/p/0f52a3defc1d

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末急但,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子搞乏,更是在濱河造成了極大的恐慌波桩,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件请敦,死亡現(xiàn)場離奇詭異镐躲,居然都是意外死亡,警方通過查閱死者的電腦和手機侍筛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門萤皂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匣椰,你說我怎么就攤上這事裆熙。” “怎么了禽笑?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵入录,是天一觀的道長。 經(jīng)常有香客問我佳镜,道長僚稿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任蟀伸,我火速辦了婚禮蚀同,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啊掏。我一直安慰自己唤崭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布脖律。 她就那樣靜靜地躺著谢肾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪小泉。 梳的紋絲不亂的頭發(fā)上芦疏,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天冕杠,我揣著相機與錄音,去河邊找鬼酸茴。 笑死分预,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的薪捍。 我是一名探鬼主播笼痹,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酪穿!你這毒婦竟也來了凳干?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤被济,失蹤者是張志新(化名)和其女友劉穎救赐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體只磷,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡经磅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钮追。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片预厌。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖元媚,靈堂內(nèi)的尸體忽然破棺而出配乓,到底是詐尸還是另有隱情,我是刑警寧澤惠毁,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布犹芹,位于F島的核電站,受9級特大地震影響鞠绰,放射性物質(zhì)發(fā)生泄漏腰埂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一蜈膨、第九天 我趴在偏房一處隱蔽的房頂上張望屿笼。 院中可真熱鬧,春花似錦翁巍、人聲如沸驴一。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肝断。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胸懈,已是汗流浹背担扑。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趣钱,地道東北人涌献。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像首有,于是被迫代替她去往敵國和親燕垃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

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

  • 2.1 Activity 2.1.1 Activity的生命周期全面分析 典型情況下的生命周期:在用戶參與的情況下...
    AndroidMaster閱讀 3,040評論 0 8
  • Android四大組件 --- Activity Activity生命周期 生命周期:onCreate() -> ...
    zhazhaxin閱讀 40,154評論 28 173
  • Activity Activity 頁面單元 負(fù)責(zé)頁面的顯示與交互生命周期1 1.生命周期 onCreate()A...
    芒果味的你呀閱讀 1,063評論 4 5
  • Android四大組件用了很多遍了井联,但還是有很多細(xì)節(jié)容易忘記卜壕,所以就寫下來吧! Activity Activity...
    AFinalStone閱讀 111評論 0 0
  • 久違的晴天低矮,家長會。 家長大會開好到教室時被冒,離放學(xué)已經(jīng)沒多少時間了军掂。班主任說已經(jīng)安排了三個家長分享經(jīng)驗。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評論 16 22