日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Android四大組件之Service服務詳細講解_Android

作者:半身風雪 ? 更新時間: 2022-09-13 編程語言

上一節: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

欄目分類
最近更新