天天看點

Android高頻面試專題 - 基礎篇(三)Service

點選上方 Android掃地僧 ,選擇 星标 公衆号

重磅資源、幹貨分享,快上車!

Android高頻面試專題 - 基礎篇(三)Service
Service在日常開發中的使用,也是非常廣泛,這裡基本上羅列了面試會問到的關于Service的問題,面試前看看應該是足夠了。

1、Service兩種啟動模式及生命周期

①Service生命周期内執行個體隻會有一個,多次調用startService(),隻有第一次會出發onCreate(),後面隻會出發onStartCommand, bindService()同理,多次綁定隻會出發onBind()。

②通過startService()啟動的服務,生命周期不受用戶端元件影響,隻能通過主動調用stop()來停止。

③通過bindService()啟動的服務,隻有所有用戶端都執行unBind(),服務才會被銷毀。

④startService()優先級高于bindService(),隻要有一個startService(),即使所有用戶端都執行unBind(),也不會被銷毀。

完整生命周期如下:

Android高頻面試專題 - 基礎篇(三)Service

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實作的。

Android高頻面試專題 - 基礎篇(三)Service