點選上方 Android掃地僧 ,選擇 星标 公衆号
重磅資源、幹貨分享,快上車!

Service在日常開發中的使用,也是非常廣泛,這裡基本上羅列了面試會問到的關于Service的問題,面試前看看應該是足夠了。
1、Service兩種啟動模式及生命周期
①Service生命周期内執行個體隻會有一個,多次調用startService(),隻有第一次會出發onCreate(),後面隻會出發onStartCommand, bindService()同理,多次綁定隻會出發onBind()。
②通過startService()啟動的服務,生命周期不受用戶端元件影響,隻能通過主動調用stop()來停止。
③通過bindService()啟動的服務,隻有所有用戶端都執行unBind(),服務才會被銷毀。
④startService()優先級高于bindService(),隻要有一個startService(),即使所有用戶端都執行unBind(),也不會被銷毀。
完整生命周期如下:
2、Service和Thread
看下官網對Service的介紹:服務是可以在背景執行長時間運作的操作的應用程式元件,并且不提供使用者界面。也就是說,如果你的應用需要在子線程執行工作,并且要和使用者有互動,可以選擇建立一個Thread,如果不需要互動,可以選擇通過服務,比如背景播放音樂。
3、Service裡面到底能不能執行耗時操作?
答案肯定是不能的,雖然Service定位是在背景執行長時間的操作,但是Service預設也是在主線程執行的,前面ANR講過,前台服務執行超過20s就會ANR,平時你也許直接Service裡面幹過不算太久的耗時操作,并且看起來沒什麼事,那是因為背景服務ANR時間是200s。
正确做法是在Service内部開啟子線程,或者直接使用IntentService。再者,在清單檔案中顯式給Service聲明一個程序,注意不是線程。
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" ></service>
複制
4、IntentService實作原理
IntentService是Service的一個子類,使用工作線程來處理所有的啟動請求,但是一次隻能處理一個。其内部使用HandleThread實作,每次請求都會在onStartCommand()裡面向 ServiceHandler發送一個Message,在handleMessage内部調用onHandleIntent來處理我們的業務邏輯,并且執行完會stopSelf(startId)自己銷毀。
5、stopSelf()與stopSelf(startId)的差別
每一次調用startService(),在onStartCommand()方法中,會産生一個startId,stopSelf()預設會傳一個startId為-1,表示停止所有請求,會銷毀服務,而stopSelf(startId)隻會停止startId的這一次請求。上面IntentService中,每一次onHandleIntent()之後stopSelf(startId)停止目前請求,所有任務執行完後,才會銷毀服務。
6、onStartCommand()傳回值的含義
- START_STICKY=1:如果 service 程序被 kill 掉,保留 service 的狀态為開始狀态,但不保留遞送的 intent 對象。随 後系統會嘗試重新建立 service,由于服務狀态為開始狀态,是以建立服務後一定會調用 onStartCommand(Intent,int,int)方法。如果在此期間沒有任何啟動指令被傳遞到 service,那麼參數 Intent 将為 null。
- START_NOT_STICKY=2:“非粘性的”。使用這個傳回值時,如果在執行完 onStartCommand 後,服務被異常 kill 掉,系統不會自動重新開機該服務。
- START_REDELIVER_INTENT=3:重傳 Intent。使用這個傳回值時,如果在執行完 onStartCommand 後,服務被異 常 kill 掉,系統會自動重新開機該服務,并将 Intent 的值傳入。
- START_STICKY_COMPATIBILITY=0: START_STICKY 的相容版本,但不保證服務被 kill 後一定能重新開機。
7、onRebind()什麼時候被調用
首先前提是onUnbind()方法傳回true,此前該服務的所有的綁定已經unBind(), 然後在新的用戶端已連接配接到該服務時就會調用。
8、前台服務是什麼?如何啟動
前台服務是使用者可感覺的,前台服務與Notification共存亡,啟動前台服務通過startForeground(int id, Notification notification)傳入一個通知,并且服務停止前,此通知無法移除。
9、Service裡面可以進行哪些操作?
- 彈Toast, 可以直接使用。
-
彈Dialog,必須申請
"android.permission.SYSTEM_ALERT_WINDOW"權限,并且設定type為TYPE_SYSTEM_ALERT,8.0後設定為TYPE_APPLICATION_OVERLAY
- startActivity, 可以,必須添加FLAG_ACTIVITY_NEW_TASK
- 發廣播,可以直接使用
10、如何提高服務的優先級
- 設定為前台廣播,也是最有效的,之前灰色保活方案使用過
- 設定優先級,清單檔案中intent-filter可以通過android:priority = “1000”設定優先級
- onStartCommand方法,傳回START_STICKY
- 清單檔案中Application加上Persistent屬性
11、項目中Service使用場景
通常用來做一些可背景進行的操作,如下載下傳更新,上傳檔案,播放音樂等等。常用的推送也是基于Service實作的。