?Service簡介
Service是一種不提供用戶交互頁面但是可以在后臺長時間運行的組件埋合,可以通過在AndroidManifest.xml設(shè)置Service的android:process=":remote"屬性,讓Service運行另一個進程中放钦,也就是說参滴,雖然你是在當前應(yīng)用啟動的這個Service瘸羡,但是這個Service和這個應(yīng)用并不是同一個進程代赁。
Android中Service總共有三種啟動方式:
[if !supportLists]·????????[endif]Scheduled甘耿,可定時執(zhí)行的Service踊兜,是Android 5.0版本中新添加的一個Service,名為JobService佳恬,繼承Service類捏境,使用JobScheduler類調(diào)度它并且設(shè)置JobService運行的一些配置。
[if !supportLists]·????????[endif]Started毁葱,通過startService()啟動的Service典蝌。通過這種方式啟動的Service會獨立的運行在后臺,即使啟動它的組件已經(jīng)銷毀了头谜。例如Activity A使用startService()啟動了Service B骏掀,過了會兒,Activity A執(zhí)行onDestroy()被銷毀了,如果Service B任務(wù)沒有執(zhí)行完畢截驮,它仍然會在后臺執(zhí)行笑陈。這種啟動方式啟動的Service需要主動調(diào)用StopService()停止服務(wù)。
[if !supportLists]·????????[endif]Bound葵袭,通過bindService()啟動的Service涵妥。通過這種方式啟動Service時候,會返回一個客戶端交互接口坡锡,用戶可以通過這個接口與服務(wù)進行交互蓬网,如果這個服務(wù)是在另一個進程中,那么就實現(xiàn)了進程間通信鹉勒,也就是Messenger和AIDL帆锋,這個會是下篇文章的重點。多個組件可以同時綁定同一個Service禽额,如果所有的組件都調(diào)用unbindService()解綁后锯厢,Service會被銷毀。
[if !supportLists]·????????[endif]?
Service是一個抽象類脯倒,需要我們?nèi)崿F(xiàn)它的抽象方法onBind()实辑,Service有且僅有這一個抽象方法,還有一些其他的生命周期回調(diào)方法需要復(fù)寫幫助我們實現(xiàn)具體的功能藻丢。
[if !supportLists]·????????[endif]onCreate()剪撬,在創(chuàng)建服務(wù)時候,可以在這個方法中執(zhí)行一些的初始化操作悠反,它在onStartCommand()和onBind()之前被調(diào)用婿奔。如果服務(wù)已經(jīng)存在,調(diào)用startService()啟動服務(wù)時候這個方法不會調(diào)用问慎,只會調(diào)用onStartCommand()方法萍摊。
[if !supportLists]·????????[endif]onStartCommand(),其他組件通過startService()啟動服務(wù)時候會回調(diào)這個方法如叼,這個方法執(zhí)行后冰木,服務(wù)會啟動被在后臺運行,需要調(diào)用stopSelf()或者stopService()停止服務(wù)笼恰。
[if !supportLists]·????????[endif]onBind()踊沸,其他組件通過bindService()綁定服務(wù)時候會回調(diào)的方法,這是Service的一個抽象方法社证,如果客戶端需要與服務(wù)交互逼龟,需要在這個方法中返回一個IBinder實現(xiàn)類實例化對象,如果不想其他客戶端與服務(wù)綁定追葡,直接返回null腺律。
[if !supportLists]·????????[endif]onDestroy()奕短,當服務(wù)不在還是用且即將被銷毀時,會回調(diào)這個方法匀钧,可以在這個方法中做一些釋放資源操作翎碑,這是服務(wù)生命周期的最后一個回調(diào)。