1.Service是一個應用程序組件(component),與Activity,BroadcastReceiver在一個層次;
2.Service沒有圖形界面;
3.通常用來處理一些耗時較長的操作(下載,播放音樂..),如果用BroadcastReceiver處理超過10s的操作通常會報錯;
4.可以使用Service更新ContentProvider,發送Intent以及啟動系統的通知等等
&
1.Service不是一個單獨的進程
2.Service不是一個單獨的線程
所以service和整個程序是在同一個進程和線程中運行的。
進程擁有獨立的內存空間以及一些資源,一個進程里面可以包含多個線程(至少一個),一個應用程序最少有一個進程。
對於多個線程,CPU采用時間片調度算法使得線程之間不停快速切換,使我們感覺程序好像在同時運行。
生命周期:
注:Android2.0以后的版本,onStart()已經被onStartCommand()代替了
Service與Activity一樣,也有一個從啟動到銷毀的過程,但Service的這個過程比Activity簡單得多。Service啟動到銷毀的過程只會經歷如下3個階段:
創建服務
開始服務
銷毀服務
一個服務實際上是一個繼承android.app.Service的類,當服務經歷上面3個階段后,會分別調用Service類中的3個事件方法進行交互,這3個事件方法如下:
- public void onCreate(); // 創建服務
- public void onStart(Intent intent, int startId); // 開始服務
- public void onDestroy(); // 銷毀服務
一個服務只會創建一次,銷毀一次,但可以開始多次,因此,onCreate和onDestroy方法只會被調用一次,而onStart方法會被調用多次。
例如,我在onCreate()寫了一個toast:
Toast.makeText(context, "it's oncreate()", Toast.LENGTH_LONG).show();
用短信觸發這個Service,在這個程序沒有運行的時候,用短信觸發之后,toast顯示了“it's oncreate()”,
然而再次嘗試用短信觸發這個程序的時候,不再顯示了,因為這個程序在后台運行了,service已經被啟用。
當我們把這個程序kill掉之后,則可以重新通過短信觸發oncreate里的toast。
而如果在onStartCommand()里面寫一個toast:
Toast.makeText(context, "it's onStartCommand()", Toast.LENGTH_LONG).show();
那么每次用短信觸發的時候就都會出現"it's onStartCommand()"的toast,不會出現只toast一次的情況。
注意這個toast要寫在return語句的前面,不然報錯,return后面好像是不能寫字的。
LINKS:
BroadcastReceiver調用Service: