【2024年4月】弊社では、基本リモートワークで一緒に成長してくださるメンバーを広く募集させていただいております。 詳細はこちら

【Android】Kotlinにおけるサービス(Service)を使用したバックグランド処理を徹底解説!

【Android】Kotlinにおけるサービス(Service)を使用したバックグランド処理を徹底解説!
すだ

Kotlinエンジニアのみなさま〜!
こんにちは!メモリアインクすだです。

本日は、
アプリ開発で重要な「バックグラウンド処理」の基本と
KotlinにおけるService(サービス)の使い方について
じっくり解説していきます!

この記事を読んでわかること…
・”バックグラウンド処理”の基本
・Service(サービス)とは?
・Service(サービス)のライフサイクルと実装方法

目次

バックグラウンド処理とは?

バックグラウンド処理とは、アプリが画面上に表示されていないときでも、裏側で動き続ける処理のことです。

たとえば、私たちが他のアプリを使っている間にも、
メールアプリは新しいメッセージを受け取り続けたり、音楽アプリは曲を再生し続けたりします。

このように、バックグラウンド処理によって、アプリはいつもスムーズに、中断することなく機能を提供できるのです。

KotlinにおけるServiceの基本

Kotlinの場合、この「バックグラウンド処理」を実現するには Service というコンポーネント(部品)を使用します。

Androidアプリの中で、ユーザーが直接見たり触ったりしない部分で働く特別なコンポーネントです。

Serviceの種類

Foreground Service(フォアグラウンド サービス)

アプリがバックグラウンド(画面の裏側)で動いているときでも、ユーザーにはっきりと知らせる形で動作します。

例えば、GPSを使った位置追跡、長時間かかるファイルのダウンロード、音楽やポッドキャストの再生など…!
これらの作業をしている間、アプリは通知を通じて自分がまだ動いていることをユーザーに示すので、
万が一作業を止めたい場合は、その通知から直接操作できるようになっていることが多いです。

Background Service(バックグラウンドサービス)

バックグラウンド(画面の裏側)でユーザーが直接操作していないときも動き続けますが、どんな動きをしているのかは、ユーザーには直接見えません。

例えば、メールアプリが新しいメールをチェックするために定期的にサーバーにアクセスしたり、
天気アプリが最新の天気情報を取得するためにデータを更新したりする場合、などなど…!
こういった処理はバックグラウンドサービスが作業を担うことが多いです。

Serviceのライフサイクル

Serviceのライフサイクルは、
アプリの画面(アクティビティ)がどのように表示されたり閉じたりするかの流れとは少し違います。

主に3つのメソッドで構成されています。

  1. onCreate()メソッド
    Serviceが最初に作成されたときに呼ばれるメソッド。

    Serviceがまだ始まっていない状態で、初期化のためのコード(例えば、リソースの準備など)をここに書きます。

  2. onStartCommand()メソッド
    Serviceが実際に仕事を始めるために呼ばれるメソッド。

    アプリの他の部分(例えば、アクティビティ)からServiceを起動するときに、このメソッドが実行されるわけです。
    ここで、バックグラウンドで行いたい作業(例えば、ファイルのダウンロード、音楽の再生など)のコードを書きます。

  3. onDestroy()メソッド
    Serviceがもう必要なくなったとき、またはシステムによって終了させられるときに呼ばれるメソッド。

    ここで、Serviceが開始したリソースを解放したり、終了の準備をしたりするコードを書きます。

実装ステップ

では早速、バックグラウンド処理を実装してみましょう!
例として、Serviceが起動されるとバックグラウンドで一定時間ごとにカウントアップする処理にしてみます。

SampleService.kt

class SampleService : Service() {
    private var isRunning = false

    override fun onCreate() {
        super.onCreate()
        Log.d("SimpleService", "Serviceが作成されました")
    }

    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        Log.d("SimpleService", "Serviceが起動しました")

        // ここにバックグラウンドで行いたい処理を書く
        if (!isRunning) {
            isRunning = true
            Thread(Runnable {
                var count = 0
                while (isRunning) {
                    count++
                    Log.d("SimpleService", "Count: $count")
                    try {
                        Thread.sleep(1000) // 1秒間隔でカウントアップ
                    } catch (e: InterruptedException) {
                        e.printStackTrace()
                    }
                }
            }).start()
        }
        return START_NOT_STICKY
    }

    override fun onDestroy() {
        super.onDestroy()
        isRunning = false // ループを終了させる
        Log.d("SimpleService", "Serviceが破棄されました")
    }

    override fun onBind(intent: Intent): IBinder? {
        return null
    }

解説

ライフサイクルに沿って、それぞれのメソッドに適切な処理を埋め込んでいきます。

特に、onStartCommand()にはバックグラウンドで行いたい処理を、
onDestroy()にはここで開いたファイルのクローズ、スレッドの停止、リスナーの解除など、リソースをクリーンアップする処理を書きます。

return START_NOT_STICKY

Serviceが強制終了した場合に再起動しないことを意味します。

onBind()

他のコンポーネントからServiceにバインド(接続)する場合に使います。
この簡単な例ではバインド処理は行わないので、nullを返しています。

すだ

ライフサイクルを適切に使用することで、
バックグラウンド処理のパフォーマンスをよりよいものにできるのです!

まとめ

おつかれさまでした〜!

Kotlinでのバックグラウンド処理の実装は、ぜひServiceを使用してくださいね!

すだ

技術者としてのキャリアパスを次のレベルへと進めたい皆様、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
を通じて、
自分の市場価値をさらに向上させてみませんか?

それではまた次の記事でお会いしましょう!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次