前面寫了四大組件的Activity,稍微詳細(xì)的描述了它的生命周期和啟動(dòng)模式。今天接著寫其余的三大組件Service、BroadcastReceiver、ContentProvider.
1.Service
Service是 Android 中實(shí)現(xiàn)程序后臺(tái)運(yùn)行的解決方案,它非常適合用于去執(zhí)行那些不需要和用戶交互而且還要求長(zhǎng)期運(yùn)行的任務(wù)。服務(wù)的運(yùn)行不依賴于任何用戶界面,即使當(dāng)程序被切換到后臺(tái),或者用戶打開(kāi)了另外一個(gè)應(yīng)用程序,服務(wù)仍然能夠保持正常運(yùn)行。不過(guò)需要注意的是,服務(wù)并不是運(yùn)行在一個(gè)獨(dú)立的進(jìn)程當(dāng)中的,而是依賴于創(chuàng)建服務(wù)時(shí)所在的應(yīng)用程序進(jìn)程。當(dāng)某個(gè)應(yīng)用程序進(jìn)程被殺掉時(shí),所有依賴于該進(jìn)程的服務(wù)也會(huì)停止運(yùn)行。
Service的啟動(dòng)過(guò)程從ContextWrapper的startService開(kāi)始。在ContextImpl中,startService方法調(diào)用startServiceCommen方法,而startServiceCommen方法會(huì)通過(guò)ActivityManagerNative.getDefault()這個(gè)對(duì)象來(lái)啟動(dòng)一個(gè)服務(wù)。
服務(wù)的使用,通常情況下,如果我們希望服務(wù)一旦啟動(dòng)就立刻去執(zhí)行某個(gè)動(dòng)作,就可以將邏輯寫在onStartCommand()方法里。而當(dāng)服務(wù)銷毀時(shí),我們應(yīng)該在 onDestroy()方法中去回收那些不再使用的資源。另外需要注意,每一個(gè)服務(wù)都需要在 AndroidManifest.xml 文件中進(jìn)行注冊(cè)才能生效
2.BroadcastReceiver
Android 中的廣播主要可以分為兩種類型,標(biāo)準(zhǔn)廣播和有序廣播。
標(biāo)準(zhǔn)廣播(Normal broadcasts)是一種完全異步執(zhí)行的廣播,在廣播發(fā)出之后,所有的廣播接收器幾乎都會(huì)在同一時(shí)刻接收到這條廣播消息,因此它們之間沒(méi)有任何先后順序可言。這種廣播的效率會(huì)比較高,但同時(shí)也意味著它是無(wú)法被截?cái)嗟摹?/p>
有序廣播(Ordered broadcasts)則是一種同步執(zhí)行的廣播,在廣播發(fā)出之后,同一時(shí)刻只會(huì)有一個(gè)廣播接收器能夠收到這條廣播消息,當(dāng)這個(gè)廣播接收器中的邏輯執(zhí)行完畢后,廣播才會(huì)繼續(xù)傳遞。所以此時(shí)的廣播接收器是有先后順序的,優(yōu)先級(jí)高的廣播接收器就可以先收到廣播消息,并且前面的廣播接收器還可以截?cái)嗾趥鬟f的廣播,這樣后面的廣播接收器就無(wú)法收到廣播消息了。
廣播的使用方法,首先要定義廣播接收者,只需要繼承BroadcastReceiver并重寫onReceive方法就可以了。需要注意的是定義好了廣播接收者還需要注冊(cè)廣播接收者,可以在AndroidManifest文件中靜態(tài)注冊(cè),也可以通過(guò)代碼動(dòng)態(tài)注冊(cè)。動(dòng)態(tài)注冊(cè)的廣播需要在合適的時(shí)機(jī)采用unregisterReceiver進(jìn)行解注冊(cè)。
3.ContentProvider
內(nèi)容提供器(Content Provider)主要用于在不同的應(yīng)用程序之間實(shí)現(xiàn)數(shù)據(jù)共享的功能,它提供了一套完整的機(jī)制,允許一個(gè)程序訪問(wèn)另一個(gè)程序中的數(shù)據(jù),同時(shí)還能保證被訪數(shù)據(jù)的安全性。目前,使用內(nèi)容提供器是 Android 實(shí)現(xiàn)跨程序共享數(shù)據(jù)的標(biāo)準(zhǔn)方式。
對(duì)于每一個(gè)應(yīng)用程序來(lái)說(shuō),如果想要訪問(wèn)內(nèi)容提供器中共享的數(shù)據(jù),就一定要借助ContentResolve 類,可以通過(guò) Context 中的 getContentResolver()方法獲取到該類的實(shí)例。ContentResolver 中提供了一系列的方法用于對(duì)數(shù)據(jù)進(jìn)行 CRUD 操作,其中 insert()方法用于添加數(shù)據(jù),update()方法用于更新數(shù)據(jù),delete()方法用于刪除數(shù)據(jù),query()方法用于查詢數(shù)據(jù)。