一、實(shí)現(xiàn)原理對比
◆Service
由APP側(cè)發(fā)出請求础锐,ActivityManagerService接收請求后進(jìn)行調(diào)度,通知APP側(cè)進(jìn)行創(chuàng)建荧缘,開始(綁定)皆警,停止(解綁)和銷毀Service。
◆JobService
由APP側(cè)發(fā)出請求截粗,JobSchedulerService接收請求后信姓,通過ActivityManagerService去調(diào)度JobService的創(chuàng)建鸵隧,綁定和解綁。
并由JobSchedulerService自己進(jìn)行JobService的開始意推,取消和停止等操作豆瘫。
從原理上看,JobService的開始菊值,取消和停止是由JobSchedulerService維護(hù)的外驱,而不是由ActivityManagerService維護(hù)的。
這是他們在實(shí)現(xiàn)原理上的明顯區(qū)別腻窒。
二略步、啟動條件對比
◆Service
Service的啟動并沒有什么特定的條件設(shè)置。
如果說非要有什么具體的執(zhí)行條件的話定页,就是APP側(cè)自己根據(jù)業(yè)務(wù)邏輯在適當(dāng)?shù)臅r候調(diào)用startService()或者bindService()趟薄。
◆JobService
JobService的執(zhí)行需要至少一個條件。沒有條件的JobService是無法啟動的典徊,在創(chuàng)建JobInfo的時候會拋出異常杭煎。
三、啟動時機(jī)對比
◆Service
APP側(cè)一旦通知Context去執(zhí)行startService()卒落,APP側(cè)的Service將得到運(yùn)行羡铲。
(使用bindService()的話,Service的運(yùn)行取決于ServiceConnection的onServiceConnected()的回調(diào))
◆JobService
JobService的執(zhí)行必須等待執(zhí)行條件滿足了才能被創(chuàng)建和開始儡毕。
三也切、執(zhí)行時間對比
◆Service
onStartCommand()的回調(diào)在UI線程,不可執(zhí)行耗時邏輯腰湾,否則可能造成ANR雷恃。
◆JobService
onStartJob()的回調(diào)在UI線程,不可執(zhí)行耗時邏輯费坊,否則可能造成ANR或者Job被強(qiáng)制銷毀(超過8s)倒槐。
并且,JobService里即便新起了線程附井,處理的時間也不能超過10min讨越,否則Job將被強(qiáng)制銷毀。
四永毅、啟動角度對比
◆Service
onStartCommand()里返回START_STICKY可以告訴AMS在被停止后自動啟動把跨。
◆JobService
onStopJob()里返回true,即可在被強(qiáng)制停止后再度啟動起來沼死。
五着逐、擴(kuò)展性對比
◆Service
APP側(cè)可以通過Binder創(chuàng)建遠(yuǎn)程Service進(jìn)行IPC。
◆JobService
JobService的綁定實(shí)際上是由JobSchedulerService自己去做的。
綁定后產(chǎn)生的Binder用于和JobSchedulerService進(jìn)行IPC滨嘱,APP側(cè)無法通過JobService擴(kuò)展去實(shí)現(xiàn)別的IPC功能峰鄙。
※Google本來的初衷也不是讓JobService實(shí)現(xiàn)遠(yuǎn)程Service的功能浸间。
六太雨、實(shí)際應(yīng)用上的對比
◆Service
適合需要常駐后臺,立即執(zhí)行魁蒜,進(jìn)行數(shù)據(jù)獲取囊扳,功能維持的場景。
比如 音樂播放兜看,定位锥咸,郵件收發(fā)等。
◆JobService
適合不需要常駐后臺细移,不需要立即執(zhí)行搏予,在某種條件下觸發(fā),執(zhí)行簡單任務(wù)的場景弧轧。
比如 聯(lián)系人信息變化后的快捷方式的更新雪侥,定期的更新電話程序的聯(lián)系人信息
七、總結(jié)
簡單來說:
Service適合一些優(yōu)先級較高精绎,執(zhí)行任務(wù)復(fù)雜耗時的任務(wù)速缨。
JobService適合輕量級的靈活的任務(wù)。