17 Service介紹
(轉(zhuǎn)自:http://www.tuicool.com/articles/iu22QnF)
服務(wù)是一個(gè)應(yīng)用程序組件,可以在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行的操作,不提供用戶界面。此外,一個(gè)組件可以綁定到一個(gè)服務(wù)與它交互,甚至執(zhí)行進(jìn)程間通信(IPC)。例如,一個(gè)服務(wù)可能處理網(wǎng)絡(luò)通信、播放音樂、執(zhí)行文件I/O,或與一個(gè)內(nèi)容提供者交互,都在后臺(tái)執(zhí)行。
(1)Started啟動(dòng)的
Started?形式的服務(wù)是指當(dāng)一個(gè)應(yīng)用組件(比如?activity?)通過startService()方法開啟的服務(wù)。一旦開啟,該服務(wù)就可以?無限期?地在后臺(tái)運(yùn)行,哪怕開啟它的組件被銷毀掉。
通常,開啟的服務(wù)執(zhí)行一個(gè)單獨(dú)的操作且并不向調(diào)用者返回一個(gè)結(jié)果。
(2)Bound綁定的
Bound?形式的服務(wù)是指一個(gè)應(yīng)用組件通過調(diào)用bindService() 方法與服務(wù)綁定。一個(gè)綁定的服務(wù)提供一個(gè)客戶-服務(wù)端接口,以允許組件與服務(wù)交互,發(fā)送請(qǐng)求,獲得結(jié)果,甚至執(zhí)行進(jìn)程間通信。一個(gè)綁定的服務(wù)只和與其綁定的組件同時(shí)運(yùn)行。多個(gè)組件可以同時(shí)綁定到一個(gè)服務(wù),但當(dāng)全部接觸綁定后,服務(wù)就被銷毀。
一個(gè)服務(wù)可以同時(shí)使用這兩種方式——可以用?started?無限期的運(yùn)行,同時(shí)允許綁定。只需要在服務(wù)中實(shí)現(xiàn)兩個(gè)回調(diào)方法:?onStartCommand()?允許組件開啟服務(wù),?onBind()?允許綁定。
不論應(yīng)用程序是怎么起服務(wù)的,?任何?應(yīng)用程序都可以用這個(gè)服務(wù)。同樣的,任何組件可以使用一個(gè)?Activity?通過傳遞?Intent?開啟服務(wù)。也可以在配置文件設(shè)置服務(wù)為私有來防止其他應(yīng)用訪問該服務(wù)。
注意:?一個(gè)服務(wù)在進(jìn)程中的主線程運(yùn)行——一個(gè)服務(wù)?不會(huì)?創(chuàng)建自己的線程,也?不會(huì)?在另外的進(jìn)程運(yùn)行(除非另外指定)。這意味著,如果服務(wù)需要做一些頻繁占用CPU的工作或者會(huì)發(fā)生阻塞的操作,需要在服務(wù)中另開線程執(zhí)行任務(wù)。這可以降低產(chǎn)生ANR的風(fēng)險(xiǎn),提高用戶體驗(yàn)。
一個(gè)服務(wù)就是一個(gè)可以忽略交互,在后臺(tái)獨(dú)立運(yùn)行的組件,如果需要這樣就用服務(wù)。
如果需要在用戶與程序交互時(shí)在主線程外執(zhí)行任務(wù),那就開個(gè)線程吧。
比如想播放音樂,但只在程序運(yùn)行時(shí)播放,你可能在onCreate() 開一個(gè)線程,在onStart() 中開啟它,在onStop() 停止它。也可以考慮使用?AsyncTask?或者HandlerThread?取代一般的線程。
如果使用一個(gè)服務(wù),它還是默認(rèn)在主線程中運(yùn)行,如果會(huì)發(fā)生阻塞,還是要在服務(wù)中另開線程的。