首頁 > 軟體

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

2022-07-20 18:03:27

上一節: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可以建立多次,銷燬多次,重複使用。

到此這篇關於Android四大元件之Service服務詳細講解的文章就介紹到這了,更多相關Android Service服務內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com