Android服務(wù)Service教程
前言:
Android的服務(wù)是開發(fā)Android應(yīng)用程序的重要組成部分。不同于活動(dòng)Activity,服務(wù)是在后臺(tái)運(yùn)行,服務(wù)沒有接口,生命周期也與活動(dòng)Activity非常不同。通過使用服務(wù)我們可以實(shí)現(xiàn)一些后臺(tái)操作,比如想從遠(yuǎn)程服務(wù)器加載一個(gè)網(wǎng)頁等。服務(wù)能幫助我們?cè)?code>Android中實(shí)現(xiàn)多任務(wù)。
我們已經(jīng)知道,安卓的活動(dòng)可以啟動(dòng),停止,當(dāng)系統(tǒng)資源太低時(shí)可以銷毀,服務(wù)被設(shè)計(jì)為實(shí)現(xiàn)具有更長執(zhí)行時(shí)間的任務(wù)。安卓的服務(wù)可以從活動(dòng)Activity中啟動(dòng),也可以從一個(gè)廣播接收器和其他服務(wù)中啟動(dòng)。
必須注意,使用服務(wù)并不需要自動(dòng)創(chuàng)建新的線程,所以如果在服務(wù)中我們實(shí)現(xiàn)一個(gè)簡單的邏輯,這不需要很長的時(shí)間去處理,我們其實(shí)不需要將它運(yùn)行在單獨(dú)的線程。但是如果我們要實(shí)現(xiàn)復(fù)雜的邏輯,用很長一段時(shí)間去處理,我們就必須采取創(chuàng)建一個(gè)新線程去執(zhí)行,否則在主線程上運(yùn)行服務(wù),可能會(huì)導(dǎo)致ANR問題。
1、服務(wù)用途
服務(wù)適合兩種用途:
- 實(shí)現(xiàn)多任務(wù)
- 激活
Inter-Process-Communication (IPC)流程間通訊
第一種情況的典型的例子是: 需要從遠(yuǎn)程服務(wù)器下載數(shù)據(jù),在這種情況下,我們可以讓應(yīng)用同時(shí)與用戶進(jìn)行交互,并在后臺(tái)開始完成工作,而用戶可以繼續(xù)使用應(yīng)用程序,當(dāng)服務(wù)完成后發(fā)送一個(gè)消息給用戶。
在第二種情況下,我們可以通過服務(wù)“共享”一些常用的功能,使不同的應(yīng)用程序可以重用這些功能。例如,假設(shè)我們有一個(gè)發(fā)送電子郵件的服務(wù),我們希望在幾個(gè)應(yīng)用程序共享此服務(wù),這樣不必重寫相同的代碼。在這種情況下,我們可以使用IPC使服務(wù)公開,這個(gè)服務(wù)向“遠(yuǎn)程”暴露接口,被其他應(yīng)用程序調(diào)用。
下面是一個(gè)簡單的服務(wù),繼承Service。
2、繼承Service
public class TestService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
服務(wù)是有生命周期的,可以實(shí)現(xiàn)其中一些回調(diào)方法:
public class TestService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
只有服務(wù)被創(chuàng)建時(shí),方法onCreate才會(huì)被唯一的調(diào)用一次。如果該服務(wù)已在運(yùn)行這個(gè)方法將不會(huì)被調(diào)用。我們也不是直接調(diào)用它,操作系統(tǒng)OS調(diào)用這個(gè)方法。
OnStartCommand是最重要的方法,因?yàn)樗徽{(diào)用的時(shí)候,我們需要啟動(dòng)服務(wù)。在這個(gè)方法中,我們需要向我們運(yùn)行的服務(wù)傳遞意圖,這樣我們就可以與服務(wù)交換一些信息。在這個(gè)方法中實(shí)現(xiàn)的邏輯可以直接在這個(gè)方法中被執(zhí)行,如果執(zhí)行很花費(fèi)時(shí)間,我們就需要?jiǎng)?chuàng)建一個(gè)線程。正如你可以看到這個(gè)方法要求我們返回一個(gè)整數(shù)作為結(jié)果。此整數(shù)表示服務(wù)如何由操作系統(tǒng)來處理。
- START_STICKY :使用這個(gè)返回值,如果OS殺死我們的服務(wù),它會(huì)重新創(chuàng)建它,但是發(fā)往該服務(wù)的意圖
Intent不會(huì)再被傳遞,這種方式下服務(wù)總是在運(yùn)行。 - START_NOT_STICKY: 如果OS殺死服務(wù),就不會(huì)再創(chuàng)建,直到客戶端顯式激活
onStart命令 - START_REDELIVER_INTENT: 它類似
START_STICKY,意圖也會(huì)被再傳遞給該服務(wù)。
OnDestroy是在服務(wù)銷毀時(shí)由操作系統(tǒng)調(diào)用。
服務(wù)需要在Manifest.xml 中配置:
<service android:name=".TestService" android:enabled="true"/>
3、啟動(dòng)和停止服務(wù)
正如我們所知道服務(wù)必須首先被啟動(dòng),并在完成它的任務(wù)后最終停止。我們可以從活動(dòng)Activity啟動(dòng)它,我們可以使用Intent傳遞給服務(wù)一些信息。假設(shè)我們有兩個(gè)按鈕,一個(gè)開始和一個(gè)停止服務(wù).
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this, TestService.class);
i.putExtra("name", "SurvivingwithAndroid");
MainActivity.this.startService(i);
}
});
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this, TestService.class);
MainActivity.this.stopService(i);
}
});
運(yùn)行效果如下:

IntentService
正如我們前面提到的服務(wù)運(yùn)行在主線程,所以我們?cè)诒痉?wù)執(zhí)行一些邏輯要非常小心。必須考慮到,如果這個(gè)邏輯是一個(gè)阻塞操作,或者需要較長的時(shí)間來完成,會(huì)導(dǎo)致一個(gè)ANR問題發(fā)生。在這種情況下,將邏輯轉(zhuǎn)移到一個(gè)單獨(dú)的線程,這意味著我們必須在onStartCommand方法創(chuàng)建線程并運(yùn)行它。還有另一類稱為IntentService的衍生服務(wù),可以簡化這些操作。當(dāng)我們不需要同時(shí)處理多個(gè)請(qǐng)求,這個(gè)類是有用的。這個(gè)類創(chuàng)建一個(gè)工作線程來處理不同的請(qǐng)求,
功能如下:
- 創(chuàng)建一個(gè)分離線程來處理請(qǐng)求
- 創(chuàng)建一個(gè)請(qǐng)求隊(duì)列然后傳遞一個(gè)
Intent消息 - 創(chuàng)建
onStartCommand的缺省實(shí)現(xiàn) - 當(dāng)所有請(qǐng)求被處理后停止服務(wù)
public class TestIntentService extends IntentService {
public TestIntentService() {
super("TestIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
}
}
onHandleIntent里面我們實(shí)現(xiàn)了邏輯,而無需關(guān)心這作業(yè)需要半天或更長,因?yàn)檫@種方法在一個(gè)單獨(dú)的線程中運(yùn)行。
4、自動(dòng)啟動(dòng)服務(wù)
如果我們想在智能手機(jī)開機(jī)時(shí)啟動(dòng)它,我們先創(chuàng)建一個(gè)廣播接收器,監(jiān)聽到這個(gè)事件,然后啟動(dòng)該服務(wù)。
public class BootBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context ctx, Intent intent) {
ctx.startService(new Intent(ctx, TestService.class));
}
}
Manifest.xml中配置:
<receiver android:name=".BootBroadcast">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
到此這篇關(guān)于Android服務(wù)Service教程的文章就介紹到這了,更多相關(guān)Android服務(wù)Service內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android使用View Animation實(shí)現(xiàn)動(dòng)畫加載界面
這篇文章主要為大家詳細(xì)介紹了Android使用View Animation實(shí)現(xiàn)動(dòng)畫加載界面的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Listview中Button搶占焦點(diǎn)的解決方法
在程序開發(fā)中經(jīng)常見到listview button搶占焦點(diǎn)的問題,怎么回事什么原因呢?下面小編給大家?guī)砹薒istview中Button搶占焦點(diǎn)的解決方法,感興趣的朋友一起看下吧2016-08-08
android自定義view實(shí)現(xiàn)圓周運(yùn)動(dòng)
這篇文章主要為大家詳細(xì)介紹了android自定義view實(shí)現(xiàn)逆時(shí)針和順時(shí)針轉(zhuǎn)動(dòng)的圓周運(yùn)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03
android開發(fā)之蜂鳴提示音和震動(dòng)提示的實(shí)現(xiàn)原理與參考代碼
蜂鳴提示音和震動(dòng)提示此功能在手機(jī)使用中很實(shí)用,最近在讀zxing項(xiàng)目,學(xué)到了不少東西;我們一起來看看他是怎么做的,感興趣的朋友可以了解下哦2013-01-01
Android學(xué)習(xí)項(xiàng)目之簡易版微信為例(二)
這篇文章主要以簡易版微信為例,實(shí)現(xiàn)簡易版微信的登陸、注冊(cè)界面的編寫與簡單交互,感興趣的小伙伴們可以參考一下2016-06-06
一步步實(shí)現(xiàn)Viewpager卡片翻頁效果
一步步實(shí)現(xiàn)Viewpager卡片翻頁效果,文章很精彩,實(shí)現(xiàn)步驟很詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
Android自定義View構(gòu)造函數(shù)詳解
這篇文章主要為大家詳細(xì)介紹了Android自定義View構(gòu)造函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Android 深入探究自定義view之流式布局FlowLayout的使用
FlowLayout(int align, int hgap, int vgap)創(chuàng)建一個(gè)新的流布局管理器,它具有指定的對(duì)齊方式以及指定的水平和垂直間隙,意思就是說從左上角開始添加原件,依次往后排,第一行擠滿了就換一行接著排2021-11-11

