網站首頁 編程語言 正文
上一節:Activity
簡介:在Android組件中最基本也是最為常見的四大組件:
- Activity
- Service服務
- Content Provider內容提供者
- BroadcastReceiver廣播接收器
一、Service是什么
Service是Android系統中的四大組件之一,它是一種長生命周期的,沒有可視化界面,運行于后臺的一種服務程序。
Service 有的啟動方式有兩種:
- startService啟動
- bindService啟動
二、Service 的啟動方式
2.1、startService 顯示啟動
Service啟動
首先我們創建一個MyService 類,并且繼承自Service
public class MyService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { return null; } }
這里需要先實現onBind方法,onBind()
是Service必須實現的方法,返回的IBinder對象相當于Service組件的代理對象,Service允許其他程序組件通過IBinder對象來訪問Service內部數據,這樣即可實現其他程序組件與Service之間的通信。
在AndroidManifest.xml
清單文件中注冊
<!-- 組件必須要在清單文件里面注冊--> <service android:name=".MyService" />
顯式啟動通過類名稱來啟動,需要在Intent中指明Service所在的類,并調用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 啟動成功"); }
運行結果
通過該方式啟動Service,訪問者與Service之間沒有關聯,即使訪問者退出了,Service也仍然運行。
按上面的說法,即使訪問者退出了,Service也仍然運行,那么我們該怎么結束呢?
Service 停止
我們在Activity 中,再添加一個停止按鈕。
顯式啟動停止Service,需要將啟動Service的Intent傳遞給stopService (Intent)函數。
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 停止"); }
運行結果
上面我說startService 是顯示啟動,那么是不是還有對應的隱式啟動呢?確實是有,但是從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); }
參數說明:
- service:該參數通過Intent指定需要啟動的service。
- connection:該參數是ServiceConnnection對象,當綁定成功后,系統將調用serviceConnnection的
onServiceConnected ()
方法,當綁定意外斷開后,系統將調用ServiceConnnection中的onServiceDisconnected方法。 - flags:該參數指定綁定時是否自動創建Service。如果指定為BIND_AUTO_CREATE,則自動創建,指定為0,則不自動創建。
初始化一個connection
private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { } @Override public void onServiceDisconnected(ComponentName componentName) { } };
綁定啟動中,當調用者通過bindService()
函數綁定Service時,onCreate()
函數和onBinde ( )
函數將被先后調用。
運行結果
通過該方式啟動Service,訪問者與Service綁定在一起,訪問者一旦退出了,Service也就終止了。
unbindService 停止服務
取消綁定僅需要使用unbindService()
方法,并將ServiceConnnection傳遞給unbindService()
方法
在停止服務點擊事件中使用 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); }
當調用者通過unbindService()
函數取消綁定Service時,onUnbind()
函數將被調用。如果onUnbind()
函數返回true,則表示重新綁定服務時,onRebind ()
函數將被調用。
運行結果
需要注意的是,unbindService()
方法成功后,系統并不會調用onServiceConnected()
,因為onServiceConnected()
只會在意外斷開綁定時才被調用。
這里別忘了在onDestroy()
銷毀bindService
@Override protected void onDestroy() { super.onDestroy(); unbindService(connection); }
三、Service 生命周期
startService啟動的生命周期
onCreate() 當Service第一次被創建時,由系統調用。
onStartCommand() 當startService方法啟動Service時,該方法被調用。
onDestroy() 當Service不再使用時,由系統調用。
注意:一個startService只會創建一次,銷毀一次,但可以開始多次,因此,onCreate()和onDestroy()方法只會被調用一次,而onStart()方法會被調用多次。
bindService啟動的生命周期
onCreate() 當Service被創建時,由系統調用。
onBind() 當bindService方法啟動Service時,該方法被調用。
onUnbind() 當unbindService方法解除綁定時,該方法被調用。
onDestroy() 當Service不再使用時,由系統調用。
注意:一個bindService可以創建多次,銷毀多次,重復使用。
原文鏈接:https://blog.csdn.net/u010755471/article/details/125486361
相關推薦
- 2022-12-26 React?Context與setState詳解使用方法_React
- 2022-11-10 C語言枚舉與聯合體深入詳解_C 語言
- 2022-11-21 C++?getcwd函數獲取項目運行路徑方法詳解_C 語言
- 2022-06-25 JetBrains公司三大編輯器迭代循環模板快捷鍵詳解_相關技巧
- 2022-10-11 C++eof()判斷是否讀取到文件尾
- 2022-03-28 C++將音頻PCM數據封裝成wav文件的方法_C 語言
- 2022-07-16 Date 轉為 LocalDate
- 2023-01-14 python的數據與matlab互通問題:SciPy_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支