第四周隨筆--Service

Service:

  • Service是一個(gè)應(yīng)用組件,后臺(tái)操作運(yùn)行,不需要用戶界面;
  • Service不是進(jìn)程也不是線程
  • 兩種形式:Started and Bound

關(guān)于manifest定義Service里面的參數(shù):

  • name
  • label
  • icon
  • enable:是否被系統(tǒng)默認(rèn)調(diào)用
  • exported:是否允許其他應(yīng)用可以使用該服務(wù)
主要重構(gòu)方法
@Override
public void onCreate() {
      super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) { 
   return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {    
      super.onDestroy();   
}
@Override
public IBinder onBind(Intent intent) {    
      return null;
}
@Override
public boolean onUnbind(Intent intent) {    
      return super.onUnbind(intent);
}

Bind:綁定

生命周期


注:onStart()已被onStartCommand()替換。

兩種啟動(dòng)服務(wù)方式:

  • 第一種:
    startService(intent);
    stopService(intent);
  • 第二種:
    bindService(intent, serviceConnection, BIND_AUTO_CREATE);
    unbindService(serviceConnection);


理解: 兩種方法都是啟動(dòng)Service,bindService的方法能使Service與界面交互,傳輸數(shù)據(jù)。
問題:如何傳輸數(shù)據(jù)呢?
大概思路:
首先綁定數(shù)據(jù)時(shí)bindService(intent, serviceConnection, BIND_AUTO_CREATE); 將攜帶serviceConnection 到指定的service;

綁定Service

然后Service里面有個(gè)“public IBinder onBind(Intent intent) ”的方法,onCreate()之后會(huì)調(diào)用這方法,這方法會(huì)返回一個(gè)IBinder(什么是IBinder?首先要明白,Android的遠(yuǎn)程調(diào)用(就是跨進(jìn)程調(diào)用)就是通過IBinder實(shí)現(xiàn)的;要實(shí)現(xiàn)IBinder來支持遠(yuǎn)程調(diào)用,應(yīng)從Binder類派生一個(gè)類。)

onBind(Intent intent)

這個(gè)return就會(huì)返回到之前的serviceConnection ,serviceConnection 有一個(gè)onServiceConnected(ComponentName name, IBinder service)的重構(gòu)方法,看下圖,localBinder就是上圖創(chuàng)建的一個(gè)類。個(gè)人認(rèn)為這個(gè)類似findViewById()的作用。

onServiceConnected

獲取了Service后就可以調(diào)用Service里面自定義的get方法獲取所需數(shù)據(jù)。例如


總結(jié),serviceConnection 就是一個(gè)橋梁、一個(gè)通道,而IBander是一個(gè)裝載貨物在通道里行走的。

網(wǎng)上搜了下,關(guān)于service的兩種開啟方式:

  1. 通過startservice開啟的服務(wù).一旦服務(wù)開啟, 這個(gè)服務(wù)和開啟他的調(diào)用者之間就沒有任何的關(guān)系了. 調(diào)用者不可以訪問 service里面的方法. 調(diào)用者如果被系統(tǒng)回收了或者調(diào)用了ondestroy方法, service還會(huì)繼續(xù)存在
  2. 通過bindService開啟的服務(wù),服務(wù)開啟之后,調(diào)用者和服務(wù)之間 還存在著聯(lián)系 , 一旦調(diào)用者掛掉了.service也會(huì)跟著掛掉 .

關(guān)于生命周期

網(wǎng)上摘抄的,感覺有用

1). 被啟動(dòng)的服務(wù)的生命周期:如果一個(gè)Service被某個(gè)Activity 調(diào)用 Context.startService 方法啟動(dòng),那么不管是否有Activity使用bindService綁定或unbindService解除綁定到該Service,該Service都在后臺(tái)運(yùn)行。如果一個(gè)Service被startService 方法多次啟動(dòng),那么onCreate方法只會(huì)調(diào)用一次,onStart將會(huì)被調(diào)用多次(對(duì)應(yīng)調(diào)用startService的次數(shù)),并且系統(tǒng)只會(huì)創(chuàng)建Service的一個(gè)實(shí)例(因此你應(yīng)該知道只需要一次stopService調(diào)用)。該Service將會(huì)一直在后臺(tái)運(yùn)行,而不管對(duì)應(yīng)程序的Activity是否在運(yùn)行,直到被調(diào)用stopService,或自身的stopSelf方法。當(dāng)然如果系統(tǒng)資源不足,android系統(tǒng)也可能結(jié)束服務(wù)。

2). 被綁定的服務(wù)的生命周期:如果一個(gè)Service被某個(gè)Activity 調(diào)用 Context.bindService 方法綁定啟動(dòng),不管調(diào)用 bindService 調(diào)用幾次,onCreate方法都只會(huì)調(diào)用一次,同時(shí)onStart方法始終不會(huì)被調(diào)用。當(dāng)連接建立之后,Service將會(huì)一直運(yùn)行,除非調(diào)用Context.unbindService 斷開連接或者之前調(diào)用bindService 的 Context 不存在了(如Activity被finish的時(shí)候),系統(tǒng)將會(huì)自動(dòng)停止Service,對(duì)應(yīng)onDestroy將被調(diào)用。

3). 被啟動(dòng)又被綁定的服務(wù)的生命周期:如果一個(gè)Service又被啟動(dòng)又被綁定,則該Service將會(huì)一直在后臺(tái)運(yùn)行。并且不管如何調(diào)用,onCreate始終只會(huì)調(diào)用一次,對(duì)應(yīng)startService調(diào)用多少次,Service的onStart便會(huì)調(diào)用多少次。調(diào)用unbindService將不會(huì)停止Service,而必須調(diào)用 stopService 或 Service的 stopSelf 來停止服務(wù)。

4). 當(dāng)服務(wù)被停止時(shí)清除服務(wù):當(dāng)一個(gè)Service被終止(1、調(diào)用stopService;2、調(diào)用stopSelf;3、不再有綁定的連接(沒有被啟動(dòng)))時(shí),onDestroy方法將會(huì)被調(diào)用,在這里你應(yīng)當(dāng)做一些清除工作,如停止在Service中創(chuàng)建并運(yùn)行的線程。


關(guān)于onStartCommand() 返回值:

  • START_NOT_STICKY:當(dāng)Service因?yàn)閮?nèi)存不足而被系統(tǒng)kill后,接下來未來的某個(gè)時(shí)間內(nèi),即使系統(tǒng)內(nèi)存足夠可用,系統(tǒng)也不會(huì)嘗試重新創(chuàng)建此Service。除非程序中Client明確再次調(diào)用startService(...)啟動(dòng)此Service。
  • START_STICKY:當(dāng)Service因?yàn)閮?nèi)存不足而被系統(tǒng)kill后,接下來未來的某個(gè)時(shí)間內(nèi),當(dāng)系統(tǒng)內(nèi)存足夠可用的情況下,系統(tǒng)將會(huì)嘗試重新創(chuàng)建此Service,一旦創(chuàng)建成功后將回調(diào)onStartCommand(...)方法,但其中的Intent將是null,pendingintent除外。
  • START_REDELIVER_INTENT:與START_STICKY唯一不同的是,回調(diào)onStartCommand(...)方法時(shí),其中的Intent將是非空,將是最后一次調(diào)用startService(...)中的intent。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容