Android Service是一個能夠在後臺執行長時間運行操做而不提供用戶界面的應用組件,它分爲兩種工做狀態,一種是啓動狀態,主要用於執行後臺計算;另外一種是綁定狀態,主要用於其餘組件和Service的交互。須要注意的兩點:android
防止ANR風險,主線程運行的Service在執行耗時操做,則應在服務內建立新線程來完成這項工做,這能夠下降發生「應用無響應」(ANR) 錯誤的風險。app
public class MyService extends Service { @Override public IBinder onBind(Intent intent) { return null; } }
Service須要重寫重要的回調方法有如下幾個ide
像Activity(以及其餘組件)同樣,您必須在應用AndroidManifest.xml清單文件中聲明全部服務函數
<service android:name=".MyService"/>
經過Context啓動一個Service,這會致使對 onStartCommand() 的調用,則服務將一直運行,直到服務使用 stopSelf() 自行中止運行,或由其餘組件經過調用 stopService() 中止,以下所示ui
startService(new Intent(this, MyService.class));
但在Android8.0的應用嘗試在不容許其建立後臺服務的狀況下使用 startService() 函數,則該函數將引起一個 IllegalStateException。 新的 Context.startForegroundService() 函數將啓動一個前臺服務。this
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { startForegroundService(intent); } else { startService(intent); }
而且在在service裏再調用startForeground方法,否則就會出現ANR線程
context.startForeground(SERVICE_ID, builder.getNotification());
經過Context綁定一個Service,且未調用 onStartCommand(),則服務只會在該組件與其綁定時運行,一旦該服務與全部客戶端之間的綁定所有取消,系統便會銷燬它,以下所示代理
bindService(new Intent(this, MyService.class), connection, BIND_AUTO_CREATE);
注意:系統內存不足時,Android會強制中止優先級低的Service來提供內存給Activity使用,但持有Activity的Service可能不會終止,或者前臺運行的Service幾乎永遠不會終止。code
首先咱們先看下Service的類的調用流程
Service最終建立須要須要經過Handler進行消息發送來實現建立,並把建立好的servic存儲在ArrayMap中。接下來看下Service的生命週期是怎樣的。
Service綁定跟Service的啓動了類調用流程基本一致,只是相關方法改成bind,但其最後會調用ServiceConnection對象的onServiceConnected方法。接下來看下Service的生命週期是怎樣的 但其有一個特性,屢次綁定同一個Service時,Service的onBind方法只會執行一次,除非Service被終止了。