Android Service類(lèi)與生命周期詳細(xì)介紹
Android Service類(lèi)與生命周期
Service是Android四大組件與Activity最相似的組件,都代表可執(zhí)行的程序,區(qū)別在于Service一直在后臺(tái)運(yùn)行且沒(méi)有用戶界面。
1.Service的類(lèi)圖和生命周期
先來(lái)看看Service的類(lèi)圖:

接下來(lái)看看Service的生命周期:

2.開(kāi)發(fā)Service
(1)開(kāi)發(fā)Service需要兩步:
第1步:定義子類(lèi),繼承Service
第2步:在AndroidManifest.xml文件中配置Service
(2)創(chuàng)建Service
public class MyService extends Service {
// 必須實(shí)現(xiàn),綁定該Service時(shí)被回調(diào)
@Override
public IBinder onBind(Intent intent) {
return null;
}
// Service被創(chuàng)建時(shí)回調(diào)
@Override
public void onCreate() {
super.onCreate();
// 定義相關(guān)業(yè)務(wù)邏輯
System.out.println("Service is Created");
}
// Service被啟動(dòng)時(shí)回調(diào)
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 定義相關(guān)業(yè)務(wù)邏輯
System.out.println("Service is Started");
return START_STICKY;
}
// Service被關(guān)閉之前回調(diào)
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("Service is Destroyed");
}
}
(3)配置Service
<application
...
<!-- 配置一個(gè)Service組件 -->
<service android:name=".MyService">
<intent-filter>
<!-- 為該Service組件的intent-filter配置action -->
<action android:name="com.gc.service.MY_SERVICE" />
</intent-filter>
</service>
</application>
接下來(lái)就可以運(yùn)行Service了。
(4)啟動(dòng)和停止Service(一般方式)
// 創(chuàng)建啟動(dòng)Service的Intent
final Intent intent = new Intent();
// 為Intent設(shè)置Action屬性
intent.setAction("com.gc.service.MY_SERVICE");
...
// 啟動(dòng)指定Serivce
startService(intent);
...
// 停止指定Serivce
stopService(intent);
當(dāng)程序使用startService()、stopService()啟動(dòng)、關(guān)閉Service時(shí),Service與訪問(wèn)者之間無(wú)法進(jìn)行通信、數(shù)據(jù)交換,故下面介紹另一種方式啟動(dòng)和停止Service。
(5)啟動(dòng)和停止Service(綁定Service并與之通信)
如果Service和訪問(wèn)者之間需要進(jìn)行方法調(diào)用或數(shù)據(jù)交換,則應(yīng)該使用bindService()和unbindService()方法啟動(dòng)、停止Service。
bindService(Intent intent, ServiceConnection conn, int flags),三個(gè)參數(shù)如下: intent:指定要啟動(dòng)的Service conn:用于監(jiān)聽(tīng)訪問(wèn)者與Service之間的連接情況,當(dāng)訪問(wèn)者與Service之間連接成功時(shí)將回調(diào)該ServiceConnection對(duì)象的onServiceConnected(ComponentName name, IBinder service)方法;反之回調(diào)該ServiceConnection對(duì)象的onServiceDisconnected(ComponentName name)方法(主動(dòng)調(diào)用unbindService方法斷開(kāi)連接時(shí)則不回調(diào)) flags:指定綁定時(shí)是否創(chuàng)建Service,0:不自動(dòng)創(chuàng)建;BIND_AUTO_CREATE:自動(dòng)創(chuàng)建 注意:ServiceConnection對(duì)象的onServiceConnected方法中有一個(gè)IBinder對(duì)象,該對(duì)象即可實(shí)現(xiàn)與綁定Service之間的通信。 在綁定本地Service的情況下,onBind(Intent intent)方法所返回的IBinder對(duì)象將會(huì)傳給ServiceConnection對(duì)象里onServiceConnected(ComponentName name, IBinder service)方法的service參數(shù),這樣訪問(wèn)者就可以通過(guò)該IBinder對(duì)象與Service進(jìn)行通信。
實(shí)際開(kāi)發(fā)通常會(huì)采用繼承Binder(IBinder的實(shí)現(xiàn)類(lèi))的方式實(shí)現(xiàn)自己的IBinder對(duì)象。
public class MyService extends Service {
private int count;
// 定義onBinder方法所返回的對(duì)象
private MyBinder binder = new MyBinder();
// 通過(guò)繼承Binder來(lái)實(shí)現(xiàn)IBinder類(lèi)
public class MyBinder extends Binder {
public int getCount() {
return count; // 獲取Service的運(yùn)行狀態(tài)
}
}
// 必須實(shí)現(xiàn),綁定該Service時(shí)被回調(diào)
@Override
public IBinder onBind(Intent intent) {
System.out.println("Service is Binded");
return binder; // 返回IBinder對(duì)象
}
// Service被創(chuàng)建時(shí)回調(diào)
@Override
public void onCreate() {
super.onCreate();
System.out.println("Service is Created");
count = 100;
}
// Service被斷開(kāi)連接時(shí)回調(diào)
@Override
public boolean onUnbind(Intent intent) {
System.out.println("Service is Unbinded");
return true;
}
// Service被關(guān)閉之前回調(diào)
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("Service is Destroyed");
}
}
接下來(lái)定義一個(gè)Activity來(lái)綁定該Service,并在該Activity中通過(guò)MyBinder對(duì)象訪問(wèn)Service的內(nèi)部狀態(tài)。
在該Activity綁定該Service后,該Activity還可以通過(guò)MyBinder對(duì)象來(lái)獲取Service的運(yùn)行狀態(tài)。對(duì)于Service的onBind(Intent intent)方法返回的IBinder對(duì)象來(lái)說(shuō),Service允許客戶端通過(guò)該IBinder對(duì)象來(lái)訪問(wèn)Service內(nèi)部的數(shù)據(jù),這樣即可實(shí)現(xiàn)客戶端與Service之間的通信。
public class MyServiceTest extends Activity {
// Service的IBinder對(duì)象
MyService.MyBinder binder;
// 定義一個(gè)ServiceConnection對(duì)象
private ServiceConnection conn = new ServiceConnection() {
// 當(dāng)該Activity與Service連接成功時(shí)回調(diào)
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 獲取Service的onBind方法所返回的MyBinder對(duì)象
binder = (MyService.MyBinder) service;
}
// 當(dāng)該Activity與Service斷開(kāi)連接時(shí)回調(diào)
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
// 創(chuàng)建啟動(dòng)Service的Intent
final Intent intent = new Intent();
// 為Intent設(shè)置Action屬性
intent.setAction("com.gc.service.MY_SERVICE");
// 綁定指定Serivce
bindService(intent, conn, Service.BIND_AUTO_CREATE);
...
binder.getCount(); // 獲取Serivce的count值
...
// 解除綁定Serivce
unbindService(conn);
}
}
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- 詳解Android中的Service
- Android IntentService詳解及使用實(shí)例
- Android 如何保證service在后臺(tái)不被kill
- android使用NotificationListenerService監(jiān)聽(tīng)通知欄消息
- Android實(shí)現(xiàn)微信自動(dòng)向附近的人打招呼(AccessibilityService)
- Android AccessibilityService實(shí)現(xiàn)微信搶紅包插件
- Android Service中使用Toast無(wú)法正常顯示問(wèn)題的解決方法
- Android基于service實(shí)現(xiàn)音樂(lè)的后臺(tái)播放功能示例
- Android Service的啟動(dòng)過(guò)程分析
相關(guān)文章
Android多個(gè)TAB選項(xiàng)卡切換效果
這篇文章主要介紹了Android多個(gè)TAB選項(xiàng)卡切換效果的實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04
Android 使用Vitamio打造自己的萬(wàn)能播放器(1)——準(zhǔn)備
本文主要介紹Android Vitamio,在Android開(kāi)發(fā)視頻播放器的時(shí)候,大家經(jīng)常會(huì)遇到系統(tǒng)版本和不同的Android手機(jī)不同導(dǎo)致開(kāi)發(fā)的軟件不能完美適用,這里給大家介紹個(gè)播放器插件可以適應(yīng)所有Android設(shè)備2016-07-07
Android實(shí)現(xiàn)層疊卡片式banner
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)層疊卡片式banner,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
Android AbsoluteLayout和RelativeLayout布局詳解
本文主要講解Android AbsoluteLayout和RelativeLayout布局,這里整理了相關(guān)資料,并附示例代碼和效果圖,有興趣的小伙伴可以參考下2016-08-08
Android編程將Activity背景設(shè)置為墻紙的簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了Android編程將Activity背景設(shè)置為墻紙的簡(jiǎn)單實(shí)現(xiàn)方法,涉及Android簡(jiǎn)單的屬性設(shè)置及XML配置修改等相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android自定義控件實(shí)現(xiàn)圓形進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)圓形進(jìn)度條的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
ActivityManagerService廣播注冊(cè)與發(fā)送示例解析
這篇文章主要為大家介紹了ActivityManagerService廣播注冊(cè)與發(fā)送示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Flutter實(shí)現(xiàn)滾動(dòng)選擇數(shù)字
這篇文章主要為大家詳細(xì)介紹了Flutter實(shí)現(xiàn)滾動(dòng)選擇數(shù)字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

