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