前提
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