編輯:關於Android編程
Service(服務)是一個應用程序組件,可以在後台執行長時間運行的操作,不提供用戶界面。其他應用程序組件可以啟動一個Serivce,它將繼續在後台運行,即使用戶切換到另一個應用程序。此外,一個組件可以綁定到一個服務與它交互,甚至執行進程間通信(IPC)。例如,一個Serivice可能處理網絡交易,播放音樂,執行文件I / O,或與一個內容提供者交互,所有的背景。
Serivice運行在哪裡呢,這是一個常見的問題。Service在默認情況下運行在主線程的托管進程(當它不創建自己的線程和不運行在一個單獨的進程)。這又意為著什麼呢,,如果您的服務將做任何CPU密集型工作或阻塞操作(如MP3播放或網絡),您應該創建一個新線程內的服務工作。通過使用一個單獨的線程,您將減少風險的應用程序沒有響應”(ANR)錯誤和應用程序的主線程可以仍然致力於用戶交互活動,可以進行UI的交互。
什麼時候應該使用Service而什麼時候應該使用線程(Thread)呢,Service是一個簡單的組件,可以在後台運行,即使用戶沒有與應用程序交互,它也可以運行,因此,您如果創建一個service的情況應該是只用它運行就好不用於界面交互。
如果您需要執行工作在你的主線程外,但只有在用戶與應用程序交互中運行,那麼你應該而不是創建一個新的線程,而不是Service。例如,如果你想播放一些音樂,但只有當你的活動正在運行,您可以創建一個線程在onCreate(),在onStart()開始運行它,然後停止在onStop()。也可以考慮使用AsyncTask或HandlerThread,而不是傳統的線程類。
Service自己會關閉嗎?當啟動一個Service,它有一個獨立的生命周期開始它的組件和服務可以無限期地在後台運行,即使開始它的組件被摧毀。因此,Service應該停止本身當它的工作是通過調用stopSelf(),或者另一個組件可以阻止它通過調用stopService()。
Service跟一個Activity一樣,有自己的生命周期回調方法,您可以實現監控服務的狀態變化,在適當的時間執行工作。如下面的框架所示演示了每個生命周期方法。
public class ExampleService extends Service { int mStartMode; // indicates how to behave if the service is killed IBinder mBinder; // interface for clients that bind boolean mAllowRebind; // indicates whether onRebind should be used @Override public void onCreate() { // The service is being created } @Override public int onStartCommand(Intent intent, int flags, int startId) { // The service is starting, due to a call to startService() return mStartMode; } @Override public IBinder onBind(Intent intent) { // A client is binding to the service with bindService() return mBinder; } @Override public boolean onUnbind(Intent intent) { // All clients have unbound with unbindService() return mAllowRebind; } @Override public void onRebind(Intent intent) { // A client is binding to the service with bindService(), // after onUnbind() has already been called } @Override public void onDestroy() { // The service is no longer used and is being destroyed } }
系統調用這個方法當另一個組件,比如一個Activity,要求服務啟動,通過調用由startService()。此方法執行後,Service啟動,可以在後台運行下去。如果你實現這個,你必須自己在停止Service工作完成後,通過調用stopSelf()或stopService()。(特別提醒:如果你只是想提供綁定,您不需要實現此方法)。
onBind()
系統調用該方法當另一個組件想綁定的Service(如執行RPC),通過調用bindService()。在你實現這種方法,您必須提供一個接口,客戶使用與服務進行通信,通過返回一個IBinder。你必須實現這個方法,但是如果你不希望允許綁定,那麼我們應該返回null。
onCreate()
當系統第一次調用Service的時候,會調用這個方法,只調用那麼一次。
此外,跟Acitivity一樣,Service需要聲明在清單文件中,如下面所示
... ...
在Android應用程序框架中,Activity和Service類都繼承了ContextWrapper類,因此,我們可以在Activity或者Service的子類中調用r
自定義日歷控件,支持舊歷、節氣、日期標注、點擊操作 (參考網絡上的日歷控件改寫)注:將下面的四張資源圖片拷貝到所建包的下一個image目錄中,如Calendar.java
好不容易用臉萌做了一個萌萌的卡通頭像,點擊“存儲”按鈕之後卻不知道剛才制作的卡通頭像文件保存到哪裡去了?難道要白做了啊?當然不是的,
簡介GreenDAO是一個開放的安卓代碼庫,來提供一個容易使用的SQLite數據庫接口,幫助開發者更加高效的處理數據——將開發者從處理低級的數據庫