### Service
#### 1、談一談Service的生命周期?
> * 參考回答:Service的生命周期涉及到六大方法
> * **onCreate()**:如果service沒被創建過,調用startService()后會執行onCreate()回調;如果service已處于運行中,調用startService()不會執行onCreate()方法。也就是說,**onCreate()只會在第一次創建service時候調用,多次執行startService()不會重復調用onCreate(),此方法適合完成一些初始化工作**;
> * **onStartComand()**:服務啟動時調用,此方法適合完成一些數據加載工作,比如會在此處創建一個線程用于下載數據或播放音樂;
> * **onBind()**:服務被綁定時調用;
> * **onUnBind()**:服務被解綁時調用;
> * **onRebind()**:服務被重新綁定時調用
> * **onDestroy()**:服務停止時調用;
> * 推薦文章:
> * [Android組件系列----Android Service組件深入解析](https://www.cnblogs.com/smyhvae/p/4070518.html)
#### 2、Service的兩種啟動方式?區別在哪?
> * 參考回答:Service的兩種啟動模式
> * **startService()**:通過這種方式調用startService,onCreate()只會被調用一次,多次調用startSercie會多次執行onStartCommand()方法。如果外部沒有調用stopService()或stopSelf()方法,service會一直運行。
> * **bindService()**:如果該服務之前**還沒創建**,系統回調順序為onCreate()→onBind()。如果調用bindService()方法前服務**已經被綁定**,多次調用bindService()方法不會多次創建服務及綁定。如果調用者希望與正在綁定的服務**解除綁定**,可以調用unbindService()方法,回調順序為onUnbind()→onDestroy();
> 
>
> * 推薦文章:
> * [Android Service兩種啟動方式詳解](https://www.jianshu.com/p/4c798c91a613)
#### 3、如何保證Service不被殺死 ?
> * 參考回答:
> * [如何保證Service不被殺死?](https://juejin.im/post/5e5c5e306fb9a07cbe346d71#heading-136)
> * **onStartCommand方式中,返回START\_STICKY或則START\_REDELIVER\_INTENT**
> * **START\_STICKY**:如果返回START\_STICKY,表示Service運行的進程被Android系統強制殺掉之后,Android系統會將該Service依然設置為started狀態(即運行狀態),但是不再保存onStartCommand方法傳入的intent對象。此常量適用于不執行命令、但無限期運行并等待作業的媒體播放器(或類似服務)。
> * **START\_NOT\_STICKY**:如果返回START\_NOT\_STICKY,表示當Service運行的進程被Android系統強制殺掉之后,不會重新創建該Service。如果系統在`onStartCommand()`返回后終止服務,則除非有待傳遞的掛起 Intent,否則系統*不會*重建服務。
> * **START\_REDELIVER\_INTENT**:如果返回START\_REDELIVER\_INTENT,其返回情況與START\_STICKY類似,但不同的是系統會保留最后一次傳入onStartCommand方法中的Intent,再次保留下來并再次傳入到重新創建后的Service的onStartCommand方法中。**此常量適用于主動執行應立即恢復的作業(例如下載文件)的服務**。
> * **提高Service的優先級** 在AndroidManifest.xml文件中對于intent-filter可以通過android:priority = "1000"這個屬性設置最高優先級,1000是最高值,如果數字越小則優先級越低,同時適用于廣播;
> * **在onDestroy方法里重啟Service** 當service走到onDestroy()時,發送一個自定義廣播,當收到廣播時,重新啟動service;
> * **提升Service進程的優先級——啟動前臺Service**, 進程優先級由高到低:前臺進程 一 可視進程 一 服務進程 一 后臺進程 一 空進程,可以使用startForeground將service放到前臺狀態,這樣低內存時,被殺死的概率會低一些;
> * **系統廣播監聽Service狀態**
> * **將APK安裝到/system/app,變身為系統級應用**
> * **注意**:以上機制都不能百分百保證Service不被殺死,除非做到系統白名單,與系統同生共死
#### 4、能否在Service開啟耗時操作 ? 怎么做 ?
> * 參考回答:
> * Service默認并不會運行在子線程中,也不運行在一個獨立的進程中,它**同樣執行在主線程中(UI線程)**。換句話說,**不要在Service里執行耗時操作,除非手動打開一個子線程**,否則有可能出現主線程被阻塞(ANR)的情況;
#### 5、用過哪些系統Service ?
> * 參考回答:
> 
>
#### 6、了解ActivityManagerService嗎?發揮什么作用
> * 參考回答: ActivityManagerService是Android中最核心的服務 , 主要負責系統中四大組件的啟動、切換、調度及應用進程的管理和調度等工作,其職責與操作系統中的進程管理和調度模塊類似;
> * 推薦文章:
> * [ActivityManagerService啟動過程](http://gityuan.com/2016/02/21/activity-manager-service/)
> * [ActivityManagerService分析——AMS啟動流程](https://blog.csdn.net/caohang103215/article/details/79597260)