Service是Android的四大組件之一,用於長時間駐留在後臺進行操作;
他區別於線程,雖然在App中進行創建和綁定的,但是最終是在主線程裏運行的。
所以,一些耗時操作,如網絡請求,用戶輸入,音視頻播放等,最好是在Service的子線程中進行處理。
服務能被其他應用程序的組件啓動,既是用戶切換到另外的應用是還能保持後臺運行,此外程序組件還能
與服務綁定,並與服務進行交互,甚至能進行進程間通信,所有這些都是後臺進行的。
服務有兩種基本類型:
Started和Bound
Started是應用程序組件調用startService()來啓動服務,一旦啓動,服務就能在後臺一致運行下去,
既是啓動它的組件已經被銷燬了。通常,started的服務執行單一的操作並且不會像調用者返回結果。
Bound是通過一個應用程序組件調用BindService()綁定到服務上,則該服務就被bound可,bound服務提供了一個客戶端/服務器接口,允許組件與服務進行交互,發送請求,獲取結果,甚至可以利用進程間通信跨進程之賜你個操作。
多組件可以同事與一個服務綁定,不過所有的組件解除綁定後,服務也就被銷燬。
服務的生命週期圖
11111
11111
Service生命週期
Service有兩種啓動方式,一種是startService();一種是BindService();
第一種生命週期爲:onCreate()-》onStart()——》ServiceRunning--》(如果調用context。stopService())
onDestory()---》ServiceShutdown
如果在程序運行期間,又調用StartService(),那麼這個時候就不走onCreate()方法,而是直接走onStart()方法
第二種生命週期:onCreate()——》onBind()——》ServiceRunning——》onUnbind()——》onDistory——》ServiceStop
和上面一樣,如果運行期間調用了BindService(),那麼這個時候會走onBind方法,而不走onCreate();
區別:onBind將返回給客戶端一個IBind接口實例,IBind允許客戶端回調服務的方法,比如得到Service運行的狀態和其他操作,
這個時候調用者和Service是綁定在一起的,Context退出了,Service就會調用onUnbind()——》ondestory進行退出
也就是說BindService會吧Service和Activity進行綁定,一旦Activity銷燬,那麼隊形的服務也就銷燬了,
按HOME不會消失。
代碼實現
首先新建一個類Myservice繼承Service
public class MyService extends Service { final static String ACTION="com.baozilichao.android"; private SimpleBind binder;
重寫方法
onCreate創建服務
onStartConnand啓動服務
onDestory銷燬服務
onBind綁定服務
onUnbind解除綁定
先在AndroidManifest中註冊服務
<service android:name=".MyService"> <!--這個是進行服務啓動的時候的過濾的,啓動指定的服務--> <intent-filter> <action android:name="com.baozilichao.android"/> </intent-filter> </service>啓動服務時,調用方法啓動服務
startService(new Intent(MyService.ACTION));
停止服務
stopService(new Intent(MySrevice.ACTION));
綁定服務
首先:Intent intent=new Intent(MyService.ACTION);
聲明創建關聯的方法;
ServiceConntion sc=new ServiceConntion(){
public void onServiceConnected(ComponentName componentName,IBinder iBinder){
MyService.SimpleBind binder=(MyService.Simple)iBinder;}
在Myservice中自定義方法,這裏模擬從服務中獲取數據
class SimpleBind extends Binder { public String getString(){ return "已獲得來自服務的一個數據"; }在IBinder返回數據
調用方法綁定服務
BindService(intent,sc,BIND_AUTO_CREATE);
完成後綁定成功