Table of Contents
はじめに
FundastA Inc.の鈴木です。
Android StudioのServiceを用いて、開発する場面があったのですが、なかなか理解するのに苦労したので、備忘録として書いていきたいと思います。
Serviceとは?
まずServiceってなに?という話ですね。
ドキュメントには
バックグランドで長時間動作して操作を行うアプリコンポーネントであり、ユーザインターフェースは表示しない
つまりUI側で表示されるのではなく、バックグラウンド上で動かしたい処理に使用するイメージではないでしょうか。
またサービスの種類として、3種類あるそうです。
- フォアグラウンド サービス
- こちらはユーザーが認識できる操作を行うことができます。
- 例えば、YouTubeが裏画面に行っても音は流れている状況があると思います。(おそらくプレミアム会員だけ?)その状況はユーザがYouTubeを操作していなくても音が流れているのは認識できているため、フォアグラウンドサービスになります。
- バックグラウンド サービス
- こちらはユーザーには認識されない操作を行います。
- ストレージの圧縮やスマホのGPS情報を飛ばすなど、人には認識されず、裏でコソコソ作業を行ってくれるサービスになります。
- バインドされたサービス
- 他のアプリコンポーネントがサービスにバインドした状態になると動作し、アンバインドになるまでサービスを継続して動作してくれます。
- アプリAからサービスBをバインドすることでアプリAがバインドした状態であれば、サービスBが動き続けることができるようになります。
Serviceの基本
どのように使用されるか確認していきます。
まずはサービスのサブクラスを作成するか既存のサブクラスを使用する必要がある。
※Android Studioドキュメントから
メインアクティビティなどに記載するのではなく、サービスクラスを別ファイルで作成した方が良いということですね。
またそのクラスを記載する中でオーバライドするべきメソッドがあるので、そちらを記載します。
onStartCommand()
ドキュメントには以下のように記載されています。
他のコンポーネント(アクティビティなど)がサービスの開始をリクエストするときにstartService() を呼び出すと、このメソッドが呼び出されます。
このメソッドが実行されると、サービスが開始され、バックグラウンドで無期限に動作できます。
※Android Studioドキュメントから
このメソッドを起点にサービスが動くようです。
メインアクティビティで下記のように記載することで、起動
1 |
TestService.startService() |
このメソッドの注意点として、作業が完了した場合、以下の点に注意が必要です。
作業完了時に stopSelf() か stopService() を呼び出して自身でサービスを停止する必要があります。
※Android Studioドキュメントから
開始した後は、自分で止める動作をしないとアプリが終了しているのにサービスが終わらないという異常な形になってしまうので、終了する処理を記載しましょう。
onBind()
他のコンポーネントがサービスにバインドするときに bindService() を呼び出すと、このメソッドが呼び出されます。このメソッドの実装時には、IBinder を返してクライアントがサービスとの通信に使うインターフェースを提供する必要があります。このメソッドの実装は常に必要です。ただし、バインドを許可しない場合は、null を返す必要があります。
※Android Studioドキュメントから
バインドすると何が良いかというと、アクティビティと繋がり、リクエストの送信、レスポンスの受信、プロセス間通信ができるようになるそうです。
こちらは先ほど記載のあったバインドサービスになります。こちらで他のアプリコンポーネントから呼び出されることでバインドすることができます。
onCreate()
サービスが最初に作成されたときに 1 回限りのセットアップ処理を行う
※Android Studioドキュメントから
こちらはメインアクティビティでも使用されているので、イメージしやすいかと思います。
サービスが作成された時に、動かしたい処理を記載する。
onDestroy
サービスが使用されなくなり、破棄されるときに、このメソッドが呼び出されます。
※Android Studioドキュメントから
こちらもメインアクティビティで使用されることがあるメソッドですね。
終了時に呼び出したい処理を記載するイメージで良いと思います。
onStartCommand()の終了する処理などを記載する。
使用方法
マニフェストに使用するサービスを記載
1 2 3 4 5 |
<service android:description:"Test Service Class" android:name=".TestService" android:exported:false /> |
今回記載した “description”はサービスクラスの説明、 “exported”は他のアプリからバインドし、使用できるサービスかどうかを記載しています。
サービスクラスの作成
ドキュメントからコードを持ってきているので、詳細を知りたい方は「参考」に記載しているURLに飛んで確認してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class TestService : Service() { override fun onCreate() { // サービスを実行しているスレッドを開始します。 // サービスは通常プロセスのメインスレッドで実行されるため、別のスレッドを作成することに注意してください。 // また、バックグラウンドで優先されるため、CPUに作業させることによって、UIが中断されることはありません。 test.startCreate() } } override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show() return START_STICKY } override fun onBind(intent: Intent): IBinder? { // バインディングを提供しないため、null を返します return null } override fun onDestroy() { Toast.makeText(this, "service stop", Toast.LENGTH_SHORT).show() } } |
上記のようにオーバーライドで使用するべき関数を記載し、それぞれの関数の中に処理を記載します。
また onStartCommand() では、注意点があります。
それは、整数を返す必要があるということです。(”START_STICKY” 部分)
ドクキュメントには以下のように記載があります。
この整数はシステムがサービスを強制終了した場合に、サービスをどのように実行するか示す値です。
今回は “START_STICKY” を使用していますが、この他にも整数があるので、状況に合わせて使用しましょう。
サービスクラスの実行
1 2 3 4 5 6 7 8 9 10 11 |
package com.testactivity.test import androidx.appcompat.app.AppCompatActivity import android.os.Bundle class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) TestService.startService() } } |
こちらはメインアクティビティで実行していますが、自分がサービスを動かしたい箇所に変更することで思い通りのタイミングで実行可能です。
以上がサービスクラスの実装例になります。
まとめ
今回は、サービスクラスについてまとめてみました。
バックグラウンド側で勝手に動かしてくれる便利な機能があることを初めて知り、とても勉強になりました。
アプリ開発の実務を経験していくと自分が考えたことのない実装があり、初めて聞く言葉が多くなって来ました。
最初は中々イメージができず、正直理解が及ばない箇所があるので、挫けそうになります。
ですから、ブログにまとめたり、ノードに書き起こすなどアウトプットを重ねていきたいと思います。
またAndroid Studioの中で不明点などがあれば、まとめていきたいと思います。
このブログが少しでも皆さんのお役に立てれば幸いです。
ご覧いただき、ありがとうございました。