Android四大組件之Service服務(wù)詳細講解
上一節(jié):Activity
簡介:在Android組件中最基本也是最為常見的四大組件:
- Activity
- Service服務(wù)
- Content Provider內(nèi)容提供者
- BroadcastReceiver廣播接收器
一、Service是什么
Service是Android系統(tǒng)中的四大組件之一,它是一種長生命周期的,沒有可視化界面,運行于后臺的一種服務(wù)程序。
Service 有的啟動方式有兩種:
- startService啟動
- bindService啟動
二、Service 的啟動方式
2.1、startService 顯示啟動
Service啟動
首先我們創(chuàng)建一個MyService 類,并且繼承自Service
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
這里需要先實現(xiàn)onBind方法,onBind() 是Service必須實現(xiàn)的方法,返回的IBinder對象相當于Service組件的代理對象,Service允許其他程序組件通過IBinder對象來訪問Service內(nèi)部數(shù)據(jù),這樣即可實現(xiàn)其他程序組件與Service之間的通信。
在AndroidManifest.xml 清單文件中注冊
<!-- 組件必須要在清單文件里面注冊--> <service android:name=".MyService" />
顯式啟動通過類名稱來啟動,需要在Intent中指明Service所在的類,并調(diào)用startService (lntent)啟動service。這里我使用按鈕測試,需要在activity 中添加一個 serviceStart 按鈕,用來演示
public void onClick(View view) {
startService(new Intent(this, MyService.class));
}
回到MyService 類,并且添加一個onCreate 生命周期,用于驗證我們的啟動
@Override
public void onCreate() {
super.onCreate();
System.out.println("MyService.onCreate service 啟動成功");
}
運行結(jié)果

通過該方式啟動Service,訪問者與Service之間沒有關(guān)聯(lián),即使訪問者退出了,Service也仍然運行。
按上面的說法,即使訪問者退出了,Service也仍然運行,那么我們該怎么結(jié)束呢?
Service 停止
我們在Activity 中,再添加一個停止按鈕。
顯式啟動停止Service,需要將啟動Service的Intent傳遞給stopService (Intent)函數(shù)。
public void onClickStop(View view) {
stopService(new Intent(this, MyService.class));
}
回到MyService 類,并且添加一個onDestroy 生命周期,用于驗證我們的停止
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("MyService.onDestroy service 停止");
}
運行結(jié)果

上面我說startService 是顯示啟動,那么是不是還有對應(yīng)的隱式啟動呢?確實是有,但是從Android5.0開始,Google要求必須使用顯示Intent啟動Service,所以隱式啟動咱就不介紹了。
2.2、bindService 綁定啟動
使用bindService()方法啟動Service
我們在回到Activity 中,再添加兩個按鈕,onClickBindServiceStart 和 onClickUnBindService 按鈕
public void onClickBindServiceStart(View view) {
bindService(new Intent(this, MyService.class), connection, Context.BIND_AUTO_CREATE);
}
參數(shù)說明:
- service:該參數(shù)通過Intent指定需要啟動的service。
- connection:該參數(shù)是ServiceConnnection對象,當綁定成功后,系統(tǒng)將調(diào)用serviceConnnection的
onServiceConnected ()方法,當綁定意外斷開后,系統(tǒng)將調(diào)用ServiceConnnection中的onServiceDisconnected方法。 - flags:該參數(shù)指定綁定時是否自動創(chuàng)建Service。如果指定為BIND_AUTO_CREATE,則自動創(chuàng)建,指定為0,則不自動創(chuàng)建。
初始化一個connection
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
綁定啟動中,當調(diào)用者通過bindService()函數(shù)綁定Service時,onCreate()函數(shù)和onBinde ( )函數(shù)將被先后調(diào)用。
運行結(jié)果

通過該方式啟動Service,訪問者與Service綁定在一起,訪問者一旦退出了,Service也就終止了。
unbindService 停止服務(wù)
取消綁定僅需要使用unbindService()方法,并將ServiceConnnection傳遞給unbindService()方法
在停止服務(wù)點擊事件中使用 unbindService() 方法
public void onClickUnBindService(View view) {
unbindService(connection);
}
回到MyService 類,添加onUnbind 生命周期方法
@Override
public boolean onUnbind(Intent intent) {
System.out.println("MyService.onUnbind");
return super.onUnbind(intent);
}
當調(diào)用者通過unbindService()函數(shù)取消綁定Service時,onUnbind()函數(shù)將被調(diào)用。如果onUnbind()函數(shù)返回true,則表示重新綁定服務(wù)時,onRebind ()函數(shù)將被調(diào)用。
運行結(jié)果

需要注意的是,unbindService()方法成功后,系統(tǒng)并不會調(diào)用onServiceConnected(),因為onServiceConnected()只會在意外斷開綁定時才被調(diào)用。
這里別忘了在onDestroy() 銷毀bindService
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(connection);
}
三、Service 生命周期

startService啟動的生命周期
onCreate() 當Service第一次被創(chuàng)建時,由系統(tǒng)調(diào)用。
onStartCommand() 當startService方法啟動Service時,該方法被調(diào)用。
onDestroy() 當Service不再使用時,由系統(tǒng)調(diào)用。
注意:一個startService只會創(chuàng)建一次,銷毀一次,但可以開始多次,因此,onCreate()和onDestroy()方法只會被調(diào)用一次,而onStart()方法會被調(diào)用多次。
bindService啟動的生命周期
onCreate() 當Service被創(chuàng)建時,由系統(tǒng)調(diào)用。
onBind() 當bindService方法啟動Service時,該方法被調(diào)用。
onUnbind() 當unbindService方法解除綁定時,該方法被調(diào)用。
onDestroy() 當Service不再使用時,由系統(tǒng)調(diào)用。
注意:一個bindService可以創(chuàng)建多次,銷毀多次,重復(fù)使用。
到此這篇關(guān)于Android四大組件之Service服務(wù)詳細講解的文章就介紹到這了,更多相關(guān)Android Service服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android編程讀取Assets所有文件(遍歷每一個文件夾)并存入sdcard的方法
這篇文章主要介紹了Android編程讀取Assets所有文件(遍歷每一個文件夾)并存入sdcard的方法,涉及Android針對文件與目錄的遍歷及I/O操作相關(guān)技巧,需要的朋友可以參考下2016-02-02
Android中兩個Activity之間數(shù)據(jù)傳遞及返回問題
本篇文章主要介紹了Android中兩個Activity之間數(shù)據(jù)傳遞及返回問題,這里整理了詳細的代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02
android自定義view實現(xiàn)數(shù)字進度條
這篇文章主要為大家詳細介紹了android自定義view實現(xiàn)數(shù)字進度條,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
Android中解決WebView上下滑動監(jiān)聽問題
本篇文章主要介紹了Android中解決WebView滑動監(jiān)聽問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
一文讀懂Android?Kotlin的數(shù)據(jù)流
這篇文章主要介紹了一文讀懂Android?Kotlin的數(shù)據(jù)流,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-07-07

