官方原文: 地址
成都創(chuàng)新互聯(lián)公司主要從事成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)班戈,10多年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
本文摘錄自官方原文,方便自己觀看。
service 是一個可以在后臺長時間運行的操作而不提供用戶界面的應(yīng)用組件。服務(wù)可以由其他應(yīng)用組件啟動,而且即使用戶切換到其他應(yīng)用程序,服務(wù)仍將在后臺繼續(xù)運行。此外,組件可以綁定到服務(wù),以與之進行交互,甚至執(zhí)行進程間的通信(IPC)
服務(wù)基本分為兩種形式:
啟動
綁定
上述雖然分開概括這兩種服務(wù),但是服務(wù)可以同時以這兩種方式運行,也就是說,他既可以是啟動服務(wù)(以無限期運行),也允許綁定。問題在于是否實現(xiàn)了一組回調(diào)方法: onStartCommand() (允許組件啟動服務(wù))和 onBing() (允許綁定服務(wù))。
無論應(yīng)用是出于啟動狀態(tài)還是綁定狀態(tài),亦或處于啟動并且綁定狀態(tài),任何應(yīng)用組件均可以像使用Activity那么調(diào)用Itent來使用服務(wù)(即使此服務(wù)來自另一應(yīng)用)。 不過,您可以通過清單文件將服務(wù)聲明為私有服務(wù),并阻止其他應(yīng)用訪問。 使用清單文件聲明服務(wù)部分將對此做更詳盡的闡述。
注意:
服務(wù)在其托管進程的主線程中運行,它既不創(chuàng)建自己的線程,也不在單獨的進程中運行(除非另行指定)。這意味著,如果服務(wù)將執(zhí)行任何CPU密集型工作或者阻止性操作(我理解為耗時操作,例如 MP3 播放或聯(lián)網(wǎng)),則應(yīng)在服務(wù)內(nèi)創(chuàng)建新線程來完成這項工作。通過使用單獨的線程,可以降低發(fā)生“應(yīng)用無響應(yīng)”(ANR) 錯誤的風險,而應(yīng)用的主線程仍可繼續(xù)專注于運行用戶與 Activity 之間的交互。
要創(chuàng)建服務(wù),您必須創(chuàng)建 Service 的子類(或使用它的一個現(xiàn)有子類)。在實現(xiàn)中,您需要重寫一些回調(diào)方法,以處理服務(wù)生命周期的某些關(guān)鍵方面并提供一種機制將組件綁定到服務(wù)(如適用)。 應(yīng)重寫的最重要的回調(diào)方法包括:
onStartCommand()
onBind()
onCreate()
onDestroy()
如果組件通過調(diào)用 startService() 啟動服務(wù)(這會導(dǎo)致對 onStartCommand() 的調(diào)用),則服務(wù)將一直運行,直到服務(wù)使用 stopSelf() 自行停止運行,或由其他組件通過調(diào)用 stopService() 停止它為止。
如果組件是通過調(diào)用 bindService() 來創(chuàng)建服務(wù)(且未調(diào)用 onStartCommand() ,則服務(wù)只會在該組件與其綁定時運行。一旦該服務(wù)與所有客戶端之間的綁定全部取消,系統(tǒng)便會銷毀它。
如同 Activity(以及其他組件)一樣,您必須在應(yīng)用的清單文件中聲明所有服務(wù)。
要聲明服務(wù),請?zhí)砑? service 元素作為 application 元素的子元素。例如:
為了確保應(yīng)用的安全性, 請始終使用顯式 Intent 啟動或綁定 Service,且不要為服務(wù)聲明 Intent 過濾器。 啟動哪個服務(wù)存在一定的不確定性,而如果對這種不確定性的考量非常有必要,則可為服務(wù)提供 Intent 過濾器并從 Intent 中排除相應(yīng)的組件名稱,但隨后必須使用 setPackage() 方法設(shè)置 Intent 的軟件包,這樣可以充分消除目標服務(wù)的不確定性。
此外,還可以通過添加 android:exported 屬性并將其設(shè)置為 "false" ,確保服務(wù)僅適用于您的應(yīng)用。這可以有效阻止其他應(yīng)用啟動您的服務(wù),即便在使用顯式 Intent 時也如此
Service
IntentService
簡單地說,服務(wù)是一種即使用戶未與應(yīng)用交互也可在后臺運行的組件。 因此,您應(yīng)僅在必要時才創(chuàng)建服務(wù)。
如需在主線程外部執(zhí)行工作,不過只是在用戶正在與應(yīng)用交互時才有此需要,則應(yīng)創(chuàng)建新線程而非服務(wù)。 例如,如果您只是想在 Activity 運行的同時播放一些音樂,則可在 onCreate() 中創(chuàng)建線程,在 onStart() 中啟動線程,然后在 onStop() 中停止線程。您還可以考慮使用 AsyncTask 或 HandlerThread,而非傳統(tǒng)的 Thread 類。
前臺服務(wù)被認為是用戶主動意識到的一種服務(wù),因此在內(nèi)存不足時,系統(tǒng)也不會考慮將其終止。 前臺服務(wù)必須為狀態(tài)欄提供通知,放在“正在進行”標題下方,這意味著除非服務(wù)停止或從前臺移除,否則不能清除通知。
要請求讓服務(wù)運行于前臺,請調(diào)用 startForeground() 。此方法采用兩個參數(shù):唯一標識通知的整型數(shù)和狀態(tài)欄的 Notification 。例如:
注意 :提供給 startForeground() 的整型 ID 不得為 0。
要從前臺移除服務(wù),請調(diào)用 stopForeground() 。此方法采用一個布爾值,指示是否也移除狀態(tài)欄通知。 此方法不會停止服務(wù)。 但是,如果您在服務(wù)正在前臺運行時將其停止,則通知也會被移除。
與 Activity 類似,服務(wù)也擁有生命周期回調(diào)方法,您可以實現(xiàn)這些方法來監(jiān)控服務(wù)狀態(tài)的變化并適時執(zhí)行工作。 以下框架服務(wù)展示了每種生命周期方法:
注 :與 Activity 生命周期回調(diào)方法不同,您 不 需要調(diào)用這些回調(diào)方法的超類實現(xiàn)。
注 :盡管啟動服務(wù)是通過調(diào)用 stopSelf() 或 stopService() 來停止,但是該服務(wù)并無相應(yīng)的回調(diào)(沒有 onStop() 回調(diào))。因此,除非服務(wù)綁定到客戶端,否則在服務(wù)停止時,系統(tǒng)會將其銷毀 — onDestroy() 是接收到的唯一回調(diào)。
Service 是android的一種機制,當它運行的時候如果是Local Service,那么對應(yīng)的 Service 是運行在主進程的 main 線程上的。如:onCreate,onStart 這些函數(shù)在被系統(tǒng)調(diào)用的時候都是在主進程的 main 線程上運行的。如果是Remote Service,那么對應(yīng)的 Service 則是運行在獨立進程的 main 線程上。因此請不要把 Service 理解成線程,它跟線程半毛錢的關(guān)系都沒有!\x0d\x0a\x0d\x0a既然這樣,那么我們?yōu)槭裁匆?Service 呢?其實這跟 android 的系統(tǒng)機制有關(guān),我們先拿 Thread 來說。Thread 的運行是獨立于 Activity 的,也就是說當一個 Activity 被 finish 之后,如果你沒有主動停止 Thread 或者 Thread 里的 run 方法沒有執(zhí)行完畢的話,Thread 也會一直執(zhí)行。因此這里會出現(xiàn)一個問題:當 Activity 被 finish 之后,你不再持有該 Thread 的引用。另一方面,你沒有辦法在不同的 Activity 中對同一 Thread 進行控制。\x0d\x0a\x0d\x0a舉個例子:如果你的 Thread 需要不停地隔一段時間就要連接服務(wù)器做某種同步的話,該 Thread 需要在 Activity 沒有start的時候也在運行。這個時候當你 start 一個 Activity 就沒有辦法在該 Activity 里面控制之前創(chuàng)建的 Thread。因此你便需要創(chuàng)建并啟動一個 Service ,在 Service 里面創(chuàng)建、運行并控制該 Thread,這樣便解決了該問題(因為任何 Activity 都可以控制同一 Service,而系統(tǒng)也只會創(chuàng)建一個對應(yīng) Service 的實例)。\x0d\x0a\x0d\x0a因此你可以把 Service 想象成一種消息服務(wù),而你可以在任何有 Context 的地方調(diào)用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,來控制它,你也可以在 Service 里注冊 BroadcastReceiver,在其他地方通過發(fā)送 broadcast 來控制它,當然這些都是 Thread 做不到的。
Service是Android系統(tǒng)中的四大組件之一,它是一種長生命周期的,沒有可視化界面,運行于后臺的一種服務(wù)程序。如果service是被開啟的,那么它的活動生命周期和整個生命周期一同結(jié)束。如果service是被綁定的,它們它的活動生命周期是在onUnbind()方法返回后結(jié)束。
service積極活動的生命時間(active lifetime)是從onStartCommand()或onBind()被調(diào)用開始,它們各自處理由startService()或bindService()方法傳過來的Intent對象。
擴展資料
service整體的生命時間是從onCreate()被調(diào)用開始,到onDestroy()方法返回為止。和activity一樣,service在onCreate()中進行它的初始化工作,在onDestroy()中釋放殘留的資源。
比如,一個音樂播放service可以在onCreate()中創(chuàng)建播放音樂的線程,在onDestory()中停止這個線程。onCreate()和onDestroy()會被所有的service調(diào)用,不論service是通過startService()還是bindService()建立。
參考資料來源:百度百科——Service