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的生命周期
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方法等