編輯:關於Android編程
概要
若讀者之前沒接觸過service,對下面內容有個大致了解即可。待使用過service之後再來閱讀本章內容,會理解更深刻。
service是Android四大組件之一,其余的是activity、BroadcastReceiver、Content Provider。service是一個能夠在後台執行長時操作的應用程序組件,它不提供用戶界面。應用程序能夠通過service來啟動後台操作,不同應用程序也能夠通過service來實現進程間通信(IPC)。
一個service被啟動後,實際上還是運行在主線程中,即UI線程。若用戶要執行比較耗時的操作,建議新建一個線程來處理;否則可以到UI線程阻塞,影響用戶體驗。
1 service種類和區別
這裡介紹的android服務有4種,下面分別說明。
即,被啟動的服務,它是2種常見服務之一,另一種是Bound Service。它常被用在執行進程的某個後台操作,如通過該服務來實現文件下載等功能。
要提供被啟動的服務:首先,要創建一個繼承於Service的類。然後,其它的應用程序可以通過startService()來啟動該服務;若要停止服務,可以在應用程序中執行stopService(),也可以在服務中執行stopSelf()來停止服務。
當服務一旦啟動,它就能夠無限期的在後台運行,即使啟動它的組件被銷毀。通常,一個被啟動的服務執行一個單一操作,並且不給調用者返回結果。若需要返回結果,可以通過廣播(BroadcastReceiver)來實現。這些在“Android Service -- Started Service”中以詳細示例來說明。
即,被綁定的服務,和Started Service一樣,它也是2種常見服務之一。它也常被用在執行進程的某個後台操作,如通過該服務來實現文件下載等功能。
要提供被綁定的服務:首先,要創建一個繼承於Service的類。然後,其它的應用程序可以通過bindService()來綁定該服務,綁定服務後,就可以調用服務提供的功能;若要解除服務,可以在應用程序中執行unbindService()。
“Started Service”和“Bound Service”的主要區別:
(01) 啟動/停止方式不同:
(02) 實現接口不同
(03) 活躍生命周期不同
這裡“活躍生命周期”(active lifetime)不同於“完整生命周期”(entire lifetime)。它們的完整生命周期都是起始於onCreat(),結束於onDestroy()。但“活躍生命周期”指的是服務仍然是活動狀態。
補充:一個service可以同時提供“Started Service”和“Bound Service”。要能提供開始的服務,需實現onStartCommand()接口;要能提供綁定的服務,需實現onBind()。同時實現兩種接口,即能提供兩種服務。
1.3 IntentService
它的特性是對服務的請求逐個處理,而不能同時處理多個請求。
要提供IntentService:首先,要創建一個繼承於Service的類。然後,其它的應用程序可以通過startService()來啟動該服務;若要停止服務,可以在應用程序中執行stopService(),也可以在服務中執行stopSelf()來停止服務,另外,IntentService中的請求被處理完畢,它也會自動停止。
由於“IntentService”和“Started Service”的啟動和停止方式一致,我們這裡介紹一下它們的主要區別:
(01) 實現原理不同
(02) 實現的API不同
(03) 生命周期不同。
1.4 AIDL
AIDL(Android Interface Definition Language),是用來來完成進程間通信(IPC)。
一般在服務需要接受不同應用多線程的請求時才需要使用AIDL;如果是同一個應用內的請求使用Binder實現即可;如果只是應用間通信而不是多線程處理的話使用Messenger,當然這兩種情況也可以使用AIDL。本地進程和遠程進程使用AIDL有所不同,本地進程內調用時會都在調用的線程內執行,遠程進程使用是通過Service進程內一個由系統維護的線程池發出調用,所以可能是未知線程同時調用,需要注意線程安全問題。
2 服務的API
無論是“Started Service”還是“Bound Service”,它們都是繼承與Service類。下面對Service類中的主要API進行簡要說明。
onStartCommand():當其它程序調用startService()時,系統會自動調用該函數。且一旦執行了該函數,服務就被啟動了。此時,啟動的服務是“Started Service”。
onBind():當其它程序調用bindService()時,系統會自動調用該函數。一旦執行了該函數,服務就被啟動了。此時,啟動的服務是“Bounder Service”。若要提供綁定功能,則必須實現該函數,並且要返回IBinder對象;若不想提供綁定功能,則可以直接返回null。
onUnbind():當其它程序調用unbindService(),系統會自動調用該函數。
onCreate():服務被創建時,系統會自動調用該函數。一般在該函數中進行初始化工作,例如:新建線程。
onDestroy():在服務被銷毀時,系統會自動調用該函數。一般在該函數中進行清除工作,例如,終止並回收線程。
3 服務聲明方法
在manifest中,通過以下方法聲明服務
... ...
像activity一樣。你即可以在service對應的manifest中注冊intent-filter,讓其它程序通過隱式意圖來調用該服務;也可以不注冊intent-filter,直接通過顯式意圖來調用該服務。若想讓某服務成為某application的私有服務,則可以通過設置android:exported屬性為false。
4 服務的生命周期
service 的生命周期時序圖如下:
1 service種類和區別
這裡介紹的android服務有4種,下面分別說明。
引言從GraphicsLab Project項目立項以來,一直都在忙著搭建Shader的實驗環境,現在基本的實驗環境已經搭建完畢,所以就試著使用它來編寫一些效果。本篇文章
Android插件化的思考——仿QQ一鍵換膚。今天群友希望寫一個關於插件的Blog,思來想去,插件也不是很懂,只是用大致的思路看看能不能模擬一個,
寫在前面筆者近來在學習Android自定義View,收集了一些不算復雜但又“長得”還可以的自定義View效果實現,之前分享過兩個效果:一個水平的進
AutoCompleteTextView 能夠實現當用戶輸入信息的時候自動提示的功能,但是AutoCompleteTextView只能提示一次,而MultiAutoCom