-
Service 的應(yīng)用場(chǎng)景以及和 Thread 的區(qū)別
-
service 是什么
Service(服務(wù))是一個(gè)可以在后臺(tái)執(zhí)行長(zhǎng)時(shí)間操作而沒有用戶界面的組件
-
Service 和 Thread 的區(qū)別
1怪嫌、Service是系統(tǒng)的四大組件之一戳粒,Thread只是一個(gè)用來執(zhí)行后臺(tái)任務(wù)的工具類
2魄宏、Service可以設(shè)置獨(dú)立的進(jìn)程桃熄;Thread不可以,只能存在于進(jìn)程中沐旨。
3羽氮、Service有自己的生命周期杨蛋。如果是以bind的方式啟動(dòng)茎杂,生命周期跟activity相同错览。如果是以start方式啟動(dòng)纫雁,不調(diào)用stop會(huì)一直運(yùn)行在后臺(tái)煌往;Thread運(yùn)行完了就結(jié)束了,啟動(dòng)后跟activity沒有關(guān)系了,哪怕activity結(jié)束了刽脖,thread也會(huì)在后臺(tái)運(yùn)行羞海。
4、不同的Activity可以調(diào)用同一個(gè)Service曲管;不同的Activity不能調(diào)用同一個(gè)Thread却邓。
5、Service如果是運(yùn)行在后臺(tái)的院水,可以注冊(cè)接收系統(tǒng)或自定義廣播腊徙;Thread不能接收廣播
6、不同的應(yīng)用程序可以共享同一Service檬某,但不能共享同一Thread撬腾。
7、service中可以創(chuàng)建thread恢恼,避免ANR民傻。
8、Thread在后臺(tái)運(yùn)行(Activty stop)的優(yōu)先級(jí)低于后臺(tái)運(yùn)行的Service场斑,如果執(zhí)行系統(tǒng)資源緊張漓踢,會(huì)優(yōu)先殺死前一種,后臺(tái)運(yùn)行的Service一般情況下不會(huì)被殺死漏隐,如果被殺死喧半,系統(tǒng)空閑時(shí)會(huì)重新啟動(dòng)service.
什么時(shí)候用Service,什么時(shí)候用多線程青责?
從邏輯上你認(rèn)為需要一個(gè)后臺(tái)操作薯酝,但跟我們現(xiàn)在主線程操作通訊頻繁,邏輯關(guān)系緊密爽柒,就用多線程(直接用)
比如你要下載圖片吴菠,然后在當(dāng)前activity上顯示,那就用多線程
能夠從邏輯上區(qū)分開來浩村,又或者耗時(shí)較長(zhǎng)做葵,就用后臺(tái)服務(wù)
比如下載電影就用service,這樣即使來電話了心墅,也不影響下載 -
-
開啟 Service 的兩種方式以及區(qū)別
1酿矢、在調(diào)用 bindService 綁定到Service的時(shí)候,你就應(yīng)當(dāng)保證在某處調(diào)用 unbindService 解除綁定(盡管 Activity 被 finish 的時(shí)候綁定會(huì)自 動(dòng)解除怎燥,并且Service會(huì)自動(dòng)停止)瘫筐;
2、 使用 startService 啟動(dòng)服務(wù)之后铐姚,一定要使用 stopService停止服務(wù)策肝,不管你是否使用bindService肛捍;
3、同時(shí)使用 startService 與 bindService 要注意到之众,Service 的終止拙毫,需要unbindService與stopService同時(shí)調(diào)用,才能終止 Service棺禾,不管 startService 與 bindService 的調(diào)用順序缀蹄,如果先調(diào)用 unbindService 此時(shí)服務(wù)不會(huì)自動(dòng)終止,再調(diào)用 stopService 之后服務(wù)才會(huì)停止膘婶,如果先調(diào)用 stopService 此時(shí)服務(wù)也不會(huì)終止缺前,而再調(diào)用 unbindService 或者 之前調(diào)用 bindService 的 Context 不存在了(如Activity 被 finish 的時(shí)候)之后服務(wù)才會(huì)自動(dòng)停止;
4悬襟、當(dāng)在旋轉(zhuǎn)手機(jī)屏幕的時(shí)候诡延,當(dāng)手機(jī)屏幕在“橫”“豎”變換時(shí),此時(shí)如果你的 Activity 如果會(huì)自動(dòng)旋轉(zhuǎn)的話古胆,旋轉(zhuǎn)其實(shí)是 Activity 的重新創(chuàng)建肆良,因此旋轉(zhuǎn)之前的使用 bindService 建立的連接便會(huì)斷開(Context 不存在了),對(duì)應(yīng)服務(wù)的生命周期與上述相同逸绎。
5惹恃、Service 是android的一種機(jī)制,當(dāng)它運(yùn)行的時(shí)候如果是Local Service棺牧,那么對(duì)應(yīng)的 Service 是運(yùn)行在主進(jìn)程的 main 線程上的巫糙。如果是Remote Service,那么對(duì)應(yīng)的 Service 則是運(yùn)行在獨(dú)立進(jìn)程的 main 線程上颊乘,service和調(diào)用者之間的通訊都是同步的(不論是遠(yuǎn)程service還是本地service)
> 6参淹、Thread 的運(yùn)行是獨(dú)立于 Activity 的,也就是說當(dāng)一個(gè) Activity 被 finish 之后乏悄,如果你沒有主動(dòng)停止 Thread 或者 Thread 里的 run 方法沒有執(zhí)行完畢的話浙值,Thread 也會(huì)一直執(zhí)行。因此這里會(huì)出現(xiàn)一個(gè)問題:當(dāng) Activity 被 finish 之后檩小,你不再持有該 Thread 的引用开呐,也就是你下次啟動(dòng)的時(shí)候,無法控制之前創(chuàng)建的線程规求,而service則可以筐付。另一方面,你沒有辦法在不同的 Activity 中對(duì)同一 Thread 進(jìn)行控制阻肿。