search
LoginSignup
8

More than 1 year has passed since last update.

posted at

updated at

Organization

Androidアプリのプロセスの状態(フォアグラウンド、バックグラウンド、未起動)を調べる方法

概要

Androidアプリのプロセスの状態(フォアグラウンド、バックグラウンド、未起動)を調べる方法が検索しても見つからなかったので、自分で実装してみました。

考えられる用途

  • Push通知からアプリを起動する場合に、アプリが未起動の時とそうでない時で起動するアクティビティを変更する。

ソースコード

AppProcessStatus.kt
import android.app.ActivityManager
import android.content.Context
import android.os.Build

/**
 * アプリのプロセスの状態
 */
enum class AppProcessStatus {
    /** 最前面で起動中 */
    FOREGROUND,
    /** バックグラウンド状態 */
    BACKGROUND,
    /** プロセスが存在しない */
    GONE;

    companion object {
        /** 現在のアプリのプロセスの状態を取得する */
        fun current(context: Context): AppProcessStatus {
            if (!existsAppTask(context)) return GONE
            if (isForeground(context)) return FOREGROUND
            return BACKGROUND
        }

        private fun isForeground(context: Context): Boolean {
            val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
            val runningProcesses = am.runningAppProcesses
            for (processInfo in runningProcesses) {
                for (activeProcess in processInfo.pkgList) {
                    if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                        return true
                    }
                }
            }
            return false
        }

        private fun existsAppTask(context: Context): Boolean {
            val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                return am.appTasks.count() > 0
            }
            val recentTasks = am.getRunningTasks(Integer.MAX_VALUE)
            for (i in recentTasks.indices) {
                if (recentTasks[i].baseActivity.packageName == context.packageName) {
                    return true
                }
            }
            return false
        }
    }
}

注意: APIレベル21未満でも動作させるため、非推奨メソッドのActivityManager.getRunningTasksを使用しています。このメソッドを使うには非推奨パーミッションのGET_TASKSをAndroidManifest.xmlに追加する必要があります。

AndroidManifest.xml
<uses-permission android:name="android.permission.GET_TASKS" />

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
8