第四周隨筆--Service

Service:

  • Service是一個應(yīng)用組件,后臺操作運行,不需要用戶界面靶累;
  • Service不是進程也不是線程
  • 兩種形式: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()替換。

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

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


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

綁定Service

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

onBind(Intent intent)

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

onServiceConnected

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


總結(jié)迟杂,serviceConnection 就是一個橋梁、一個通道本慕,而IBander是一個裝載貨物在通道里行走的排拷。

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

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

關(guān)于生命周期

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

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

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

3). 被啟動又被綁定的服務(wù)的生命周期:如果一個Service又被啟動又被綁定,則該Service將會一直在后臺運行佑女。并且不管如何調(diào)用记靡,onCreate始終只會調(diào)用一次,對應(yīng)startService調(diào)用多少次团驱,Service的onStart便會調(diào)用多少次摸吠。調(diào)用unbindService將不會停止Service,而必須調(diào)用 stopService 或 Service的 stopSelf 來停止服務(wù)嚎花。

4). 當(dāng)服務(wù)被停止時清除服務(wù):當(dāng)一個Service被終止(1寸痢、調(diào)用stopService;2紊选、調(diào)用stopSelf啼止;3道逗、不再有綁定的連接(沒有被啟動))時,onDestroy方法將會被調(diào)用献烦,在這里你應(yīng)當(dāng)做一些清除工作憔辫,如停止在Service中創(chuàng)建并運行的線程。


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

  • START_NOT_STICKY:當(dāng)Service因為內(nèi)存不足而被系統(tǒng)kill后仿荆,接下來未來的某個時間內(nèi),即使系統(tǒng)內(nèi)存足夠可用坏平,系統(tǒng)也不會嘗試重新創(chuàng)建此Service拢操。除非程序中Client明確再次調(diào)用startService(...)啟動此Service。
  • START_STICKY:當(dāng)Service因為內(nèi)存不足而被系統(tǒng)kill后舶替,接下來未來的某個時間內(nèi)令境,當(dāng)系統(tǒng)內(nèi)存足夠可用的情況下,系統(tǒng)將會嘗試重新創(chuàng)建此Service顾瞪,一旦創(chuàng)建成功后將回調(diào)onStartCommand(...)方法舔庶,但其中的Intent將是null忍疾,pendingintent除外括儒。
  • START_REDELIVER_INTENT:與START_STICKY唯一不同的是,回調(diào)onStartCommand(...)方法時谓形,其中的Intent將是非空钉跷,將是最后一次調(diào)用startService(...)中的intent弥鹦。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爷辙,隨后出現(xiàn)的幾起案子彬坏,更是在濱河造成了極大的恐慌,老刑警劉巖膝晾,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栓始,死亡現(xiàn)場離奇詭異,居然都是意外死亡血当,警方通過查閱死者的電腦和手機幻赚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歹颓,“玉大人坯屿,你說我怎么就攤上這事∥】福” “怎么了领跛?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長撤奸。 經(jīng)常有香客問我吠昭,道長喊括,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任矢棚,我火速辦了婚禮郑什,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒲肋。我一直安慰自己蘑拯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布兜粘。 她就那樣靜靜地躺著申窘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪孔轴。 梳的紋絲不亂的頭發(fā)上剃法,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音路鹰,去河邊找鬼贷洲。 笑死,一個胖子當(dāng)著我的面吹牛晋柱,可吹牛的內(nèi)容都是我干的优构。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼雁竞,長吁一口氣:“原來是場噩夢啊……” “哼俩块!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浓领,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤玉凯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后联贩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漫仆,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年泪幌,在試婚紗的時候發(fā)現(xiàn)自己被綠了盲厌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡祸泪,死狀恐怖吗浩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情没隘,我是刑警寧澤懂扼,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響阀湿,放射性物質(zhì)發(fā)生泄漏赶熟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一陷嘴、第九天 我趴在偏房一處隱蔽的房頂上張望映砖。 院中可真熱鬧,春花似錦灾挨、人聲如沸邑退。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓜饥。三九已至,卻和暖如春浴骂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宪潮。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工溯警, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狡相。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓梯轻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尽棕。 傳聞我的和親對象是個殘疾皇子喳挑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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