【Android】通知タップ時にアプリをユーザーに表示する(フォアグラウンドにする)


前提

Android Studio 4.1.2
Kotlin 1.3.72
minSdkVersion 28
targetSdkVersion 29

前回の記事の続きになります。
kwn1125.hatenablog.com

目標

通知タップ時にアプリをユーザーに表示する(フォアグラウンドにする)。

実装

ActivityManagerクラスのmoveTaskToFrontメソッドを使うことでアプリをフォアグラウンドにすることができました。アプリ内のタスクが存在しない場合(つまりアプリ未起動の場合)に実行すると例外が発生するので注意。

APIレベルで処理を分岐してますが、taskInfo.idが非推奨(ドキュメントはこちら)で、taskInfo.taskIdがAPIレベル29以上でしか使えないためです。

package com.example.testapplication

import android.app.ActivityManager
import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.IBinder
import android.util.Log

class MyService : Service() {
    companion object {
        private const val TAG = "MyService"
    }

    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
        val appTasks = activityManager.appTasks

        if (appTasks.isEmpty()) {
            Log.d(TAG, "未起動")
        } else {
            Log.d(TAG, "起動中")

            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
                activityManager.moveTaskToFront(appTasks[0].taskInfo.taskId, 0)
            } else {
                activityManager.moveTaskToFront(appTasks[0].taskInfo.id, 0)
            }
        }

        stopSelf()
        return START_NOT_STICKY
    }

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


moveTaskToFrontメソッドについて

第2引数は「Additional operational flags」らしいのですが、これがなんなのかよくわからないので余計なことをせず0を設定してます。用意されている2つの定数の説明読んでもよくわからないし、検索しても全然いい記事が見つからない...ので、理解できたらこの記事更新するか別記事にしようと思います。 developer.android.com