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里面有個“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類派生一個類喂链。)
這個return就會返回到之前的serviceConnection ,serviceConnection 有一個onServiceConnected(ComponentName name, IBinder service)的重構(gòu)方法妥泉,看下圖椭微,localBinder就是上圖創(chuàng)建的一個類。個人認(rèn)為這個類似findViewById()的作用盲链。
獲取了Service后就可以調(diào)用Service里面自定義的get方法獲取所需數(shù)據(jù)蝇率。例如
總結(jié)迟杂,serviceConnection 就是一個橋梁、一個通道本慕,而IBander是一個裝載貨物在通道里行走的排拷。
網(wǎng)上搜了下,關(guān)于service的兩種開啟方式:
- 通過startservice開啟的服務(wù).一旦服務(wù)開啟, 這個服務(wù)和開啟他的調(diào)用者之間就沒有任何的關(guān)系了. 調(diào)用者不可以訪問 service里面的方法. 調(diào)用者如果被系統(tǒng)回收了或者調(diào)用了ondestroy方法, service還會繼續(xù)存在
- 通過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弥鹦。