-
服務(wù)介紹
-
服務(wù)類型
-
服務(wù)基本用法
-
服務(wù)生命周期
-
服務(wù)更多技巧
- 服務(wù)介紹
服務(wù)是Android中實現(xiàn)程序后臺運行的解決方案,它非常適合用于去執(zhí)行那些不需要和用戶交互而且還要長期運行的任務(wù)。服務(wù)的運行不依賴任何用戶界面,即使當程序被切換到后臺,或者用戶打開了另外一個應(yīng)用程序,服務(wù)仍然能后保持正常運行。不過需要注意的是,服務(wù)并不是運行在一個獨立的進程中,而是依賴于創(chuàng)建服務(wù)時所在的應(yīng)用程序進程。當某個應(yīng)用程序進程被殺掉時,所有依賴于該進程的服務(wù)也會停滯運行。另外服務(wù)并不會自動開啟線程,所有的代碼都是默認運行在主線程中。我們需要在服務(wù)內(nèi)部手動創(chuàng)建子線程,并在這里執(zhí)行具體的任務(wù)。 - 服務(wù)類型
使用范圍
1.本地服務(wù):用于應(yīng)用程序內(nèi)部
功能:用于實現(xiàn)應(yīng)用程序自己的一些耗時任務(wù),并不占用應(yīng)用程序比如Activity所屬線程,而是單開線程后臺執(zhí)行。
使用:在Service可以調(diào)用Context.startService啟動,調(diào)用Context.stopService結(jié)束。在內(nèi)部可以調(diào)用Service.stopSelf或Service.stopSelfResult來自己停止。無論調(diào)用了多少次startService(),都只需調(diào)用一次stopService()來停止。
2.遠程服務(wù)(Remote Sercie):用于android系統(tǒng)內(nèi)部的應(yīng)用程序之間
功能:可被其他應(yīng)用程序復用,比如天氣預報服務(wù),其他應(yīng)用程序不需要再寫這樣的服務(wù),調(diào)用已有的即可。
使用:可以定義接口并把接口暴露出來,以便其他應(yīng)用進行操作。客戶端建立到服務(wù)對象的連接,并通過那個連接來調(diào)用服務(wù)。調(diào)用Context.bindService()方法建立連接,并啟動,以調(diào)用 Context.unbindService()關(guān)閉連接。多個客戶端可以綁定至同一個服務(wù)。如果服務(wù)此時還沒有加載,bindService()會先加載它。
運行類別
1.前臺服務(wù)
前臺服務(wù)需要調(diào)用startForeground或setForeground使服務(wù)成為前臺服務(wù),使用前臺服務(wù)可以避免服務(wù)在后臺運行的時候被系統(tǒng)kill
2.后臺服務(wù)
后臺服務(wù)是處在后臺運行的。
- 服務(wù)基本用法
1.定義一個服務(wù)
public class MyService extends Service {
@Ovierride
public IBinder onBind(Intent intent) {
return null;
}
}
一個服務(wù)最常用到三個方法:onCreat、onStartCommand、onDestroy。onCreate會在服務(wù)創(chuàng)建的時候調(diào)用,onStartCommand方法會在每次服務(wù)啟動時候調(diào)用,onDestroy會在服務(wù)銷毀的時候調(diào)用。
2.服務(wù)需要在清單文件AndroidManfest.xml中進行注冊才能生效
- 服務(wù)生命周期
Service是不能自己啟動的,只能通過Context對象調(diào)用startService或者bindService方法來啟動。
1)startService:Service會經(jīng)歷onCreate->onStart。onCreate只調(diào)用一次,onstart可能會重復調(diào)用多次。stopService:調(diào)用onDestroy。如果調(diào)用者自己直接退出而沒有調(diào)用stopService的話,Service會一直在后臺運行。該Service的調(diào)用者起來后可以再調(diào)用stopService來關(guān)閉Service。
2)bindService:Service會經(jīng)歷onCreate->onBind,onBind將返回給客戶端一個IBind接口實例。會把調(diào)用者和Service綁定在一起,Context退出了,Service會調(diào)用onUnbind->onDestroy。不可多次綁定
3)在Service每一次的開啟關(guān)閉過程中,只有onStart可被多次調(diào)用(通過多次startService調(diào)用),其他onCreate,onBind,onUnbind,onDestory在一個生命周期中只能被調(diào)用一次
4)BroadcastReceiver只能通過startService啟動Service,因為廣播本身生命周期很短,bind的話沒有意義 - 服務(wù)更多技巧
1.服務(wù)基本在后臺運行,且優(yōu)先級低。若出現(xiàn)內(nèi)存不足情況下會回收服務(wù)。可以使用前臺服務(wù)來避免回收。前臺服務(wù)會一直有一個正在運行的圖標在系統(tǒng)狀態(tài)欄顯示下拉狀態(tài)欄可以看到更加詳細的信息,類似通知的效果
2.使用IntentService。onHandleIntent方法里是在線程中執(zhí)行的,不用擔心耗時程序異常問題ANR。提供一個無參構(gòu)造好書,并且必須在其內(nèi)部調(diào)用父類的有參構(gòu)造函數(shù)
public class MyIntentService extents IntentService {
public MyIntentService() {
super("MyIntentService");
}
@Override
public void onHandleIntent(Intent intent) {
}
}