-
服務(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)用程序復(fù)用,比如天氣預(yù)報服務(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可能會重復(fù)調(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í)行的讥电,不用擔(dān)心耗時程序異常問題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) {
}
}