一、服務(wù)(Service)
??????? Service是Android系統(tǒng)中的四大組件之一,它是一種長生命周期的,沒有可視化界面,運行于后臺的一種服務(wù)程序,用于在后臺完成用戶指定的操作(如:復(fù)雜的計算,音樂播放,下載等)??梢岳斫鉃槭菦]有前臺的Activity,適合用來運行不需要前臺界面的代碼,服務(wù)可以被手動關(guān)閉不會重啟,但是如果被自動關(guān)閉,內(nèi)存充足就會重啟。
??????? 特點:無用戶界面、在后臺運行、生命周期長。
二、服務(wù)的分類:
??? 1、按照使用范圍分類:本地服務(wù)和遠程服務(wù)。
??? (1)、本地服務(wù):Local? Service
?????????? 優(yōu)點:本地服務(wù)在一定程度上節(jié)約了資源,另外本地服務(wù)因為在同一個進程,因此不需要IPC,也不需要AIDL。相應(yīng)BindService會方便很多。
?????????? 缺點:主進程被Kill后,服務(wù)便會終止。
?????????? 區(qū)別:本地服務(wù)依附在主進程上,而不是獨立的進程,用于應(yīng)用程序內(nèi)部。
??????? ?? 應(yīng)用:音樂播放服務(wù)。
? (2)、遠程服務(wù):Remote Service
??????? ? 優(yōu)點:對應(yīng)進程名格式為所在包名加上指定的android:process字符串。由于是獨立的進程,因此在Activity所在進程被Kill的時候,該服務(wù)依然在運行,不受其他進程影響,有利于為多個進程提供服務(wù),具有較高的靈活性。
???????? 缺點:會占用一定的資源,并且使用AILD進行IPC稍微麻煩一點。
???????? 區(qū)別:遠程服務(wù)是獨立的進程,用于android系統(tǒng)內(nèi)部的應(yīng)用程序之間,可被其他應(yīng)用程序復(fù)用。
????? ?? 應(yīng)用:提供天氣狀況、時間日歷的系統(tǒng)服務(wù),這種Service是常駐的。
2、按運行類型分類:前臺服務(wù)和后臺服務(wù)
?? (1)、前臺服務(wù):
????????? 區(qū)別:會在通知欄顯示正在運行的Notification
????????? 應(yīng)用:當(dāng)服務(wù)被終止的時候,通知一欄的Notification也會消失,對用戶有一定的通知作用,如音樂播放服務(wù)。
?????? 服務(wù)是在調(diào)用 startForeground(android 2.0 及其以后版本)使服務(wù)成為前臺服務(wù)。這樣做的好處在于,當(dāng)服務(wù)被外部強制終止掉的時候,ONGOING 的 Notification 會被移除掉。
??? (2)、后臺服務(wù):
?????????? 區(qū)別:默認(rèn)的后臺服務(wù),沒有Notification。
?????????? 應(yīng)用:某些不需要提示的服務(wù)運行或終止時,用戶看不到效果,如天氣更新,日期同步,郵件同步等。
3、按照使用方法分類:啟動型和綁定型
??????? (1)、startService(啟動型服務(wù)):當(dāng)應(yīng)用程序組件(如Activity)調(diào)用startService()方法啟動時,服務(wù)處于started狀態(tài)。
?????? 區(qū)別:是由其他組件(如Activity)調(diào)用startService()啟動的,這導(dǎo)致服務(wù)的onStartCommand()方法被調(diào)用。當(dāng)服務(wù)是started狀態(tài)時,其生命周期與啟動它的組件無關(guān)。并且可以在后臺無限期運行,即使啟動服務(wù)的組件已經(jīng)被銷毀,因此服務(wù)需要在完成任務(wù)后調(diào)用stopService(),或者由其他組件調(diào)用stopService()方法停止。
???????? (2)、bindService(綁定型服務(wù)器):當(dāng)應(yīng)用程序組件調(diào)用bindService()方法綁定到服務(wù)時,服務(wù)處于bound狀態(tài)。
?????? 區(qū)別:使用bindService()方法啟用服務(wù),調(diào)用者與服務(wù)綁定在了一起,調(diào)用者一旦退出,服務(wù)也就終止了,大有“不求同時生,必須同時死”的特點。
4、注冊:和Activity一樣,應(yīng)用中的每個service在使用前都需要在清單文件中進行注冊,否則應(yīng)用不識別。
5、Service與Thread的區(qū)別。
???? Service與Thread無任何關(guān)系。之所以有不少人把他們聯(lián)系起來,主要是因為Service的后臺概念。
??? 后臺:后臺任務(wù)運行完全不依賴UI,即使Activity被銷毀/程序被關(guān)閉,只要進程還在,后臺任務(wù)就可以繼續(xù)運行。
二者的異同。
????? Service:
??? ? ? ? 作用:執(zhí)行異步操作。
????????? 運行線程:主線程(不能處理耗時操作,否則會出現(xiàn)ANR)
????????? 運行范圍:完全不依賴UI/Activity,只要進程還在,Service就可以繼續(xù)運行
?????????????????????????? 所有Activity都可與Service關(guān)聯(lián),獲得Binder實例&操作其中的方法。
?????????????????????????? 若需處理耗時操作,則在Service里創(chuàng)建Therad子線程執(zhí)行。
??? Thread:
????????? 作用:執(zhí)行異步操作。
????????? 運行線程:工作線程。
????????? 運行范圍:即依賴于某個Activity
??????????????????????????? 在一個Activity中創(chuàng)建的子線程,另一個Activity無法對其進行操作。
?????????????????????????? 在Activity很難控制Thread
?????????????????????????? 當(dāng)Activity被銷毀后,就無法在獲取到之前創(chuàng)建的子線程實例。