○やりたいこと
アプリを立ち上げていない時でもAlarmManagerで設定時間にアラームを鳴らす
○困っていること
現在の実装状況は以下です。
1 アプリを立ち上げている(Foreground) → アラーム起動する
2 アプリを立ち上げている(Background) → アラーム起動する
3 アプリを起動していない(GONE) → アラーム起動しない
○教えていただきたいこと
アプリを起動していない時でも、AlarmManagerで指定した時間にアラームを起動したいです。
1、2が動作しているため、AppProcessStatusは狙い通りの動作をしていると考えます。
本内容についてご教授いただけないでしょうか。
よろしくお願い致します。
以下コードですが冗長なため省いている箇所があります。
AlarmReceiver
1 2class AlarmReceiver : BroadcastReceiver() { 3 companion object { 4 val ACTION_CALL = "called"; 5 } 6 7 var localReceiver: BroadcastReceiver? = null 8 9 override fun onReceive(context: Context?, intent: Intent?) { 10 11 if (context != null) { 12 //Foreground 13 if (AppProcessStatus.current(context) == AppProcessStatus.FOREGROUND) { 14 Log.d("debug", "FOREGROUND") 15 MyNotification.sendNotification(context) 16 val intentBack = Intent("Foreground") 17 LocalBroadcastManager.getInstance(context).sendBroadcast( Intent(intentBack) ) 18 19 //Background 20 } else if (AppProcessStatus.current(context) == AppProcessStatus.BACKGROUND) { 21 Log.d("debug", "BACKGROUND") 22 MyNotification.sendNotification(context) 23 val intentBack = Intent("Background") 24 LocalBroadcastManager.getInstance(context).sendBroadcast( Intent(intentBack) ) 25 26 //Gone 27 } else if (AppProcessStatus.current(context) == AppProcessStatus.GONE) { 28 Log.d("debug", "GONE") 29 MyNotification.sendNotification(context) 30 val intentBack = Intent("Gone") 31 LocalBroadcastManager.getInstance(context).sendBroadcast( Intent(intentBack) ) 32 } 33 } 34 } 35}
AppProcessStatus
1enum class AppProcessStatus { 2 /** 最前面で起動中 */ 3 FOREGROUND, 4 /** バックグラウンド状態 */ 5 BACKGROUND, 6 /** プロセスが存在しない */ 7 GONE; 8 9 companion object { 10 /** 現在のアプリのプロセスの状態を取得する */ 11 fun current(context: Context): AppProcessStatus { 12 if (!existsAppTask(context)) return GONE //アプリ閉じてる 13 if (isForeground(context)) return FOREGROUND //最前面で起動中 14 else return BACKGROUND //バックグラウンド状態 15 } 16 17 private fun isForeground(context: Context): Boolean { 18 val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager 19 val runningProcesses = am.runningAppProcesses 20 for (processInfo in runningProcesses) { 21 for (activeProcess in processInfo.pkgList) { 22 if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { 23 return true 24 } 25 } 26 } 27 return false 28 } 29 30 private fun existsAppTask(context: Context): Boolean { 31 val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager 32 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 33 return am.appTasks.count() > 0 34 } 35 val recentTasks = am.getRunningTasks(Integer.MAX_VALUE) 36 for (i in recentTasks.indices) { 37 if (recentTasks[i].baseActivity?.packageName == context.packageName) { 38 return true 39 } 40 } 41 return false 42 } 43 } 44}
MainActivity
1class MainActivity : FragmentActivity(), TimePickerDialog.OnTimeSetListener { 2 3 private lateinit var binding: ActivityMainBinding 4 5 //Foreground 6 private val foregroundReceiver = object : BroadcastReceiver() { 7 override fun onReceive(context: Context?, intent: Intent?) { 8 val message = intent!!.action // Broadcast されたメッセージを取り出す 9 Log.d("debug", "message2: " + message.toString()) 10 moveToAlarm() //処理実行 11 } 12 } 13 14 //Background 15 private val backgroundReceiver = object : BroadcastReceiver() { 16 override fun onReceive(context: Context?, intent: Intent?) { 17 val message = intent!!.action 18 Log.d("debug", "message2: " + message.toString()) 19 moveToAlarmB() //処理実行 20 } 21 } 22 23 //Gone 24 private val goneReceiver = object : BroadcastReceiver() { 25 override fun onReceive(context: Context?, intent: Intent?) { 26 val message = intent!!.action 27 Log.d("debug", "message2: " + message.toString()) 28 moveToAlarm() //処理実行 29 } 30 } 31 32 override fun onCreate(savedInstanceState: Bundle?) { 33 super.onCreate(savedInstanceState) 34 binding = ActivityMainBinding.inflate(layoutInflater) 35 setContentView(binding.root) 36 37 //Foreground 38 LocalBroadcastManager.getInstance(this).registerReceiver( 39 foregroundReceiver, 40 IntentFilter("Foreground") 41 ) 42 //Background 43 LocalBroadcastManager.getInstance(this).registerReceiver( 44 backgroundReceiver, 45 IntentFilter("Background") 46 ) 47 LocalBroadcastManager.getInstance(this).registerReceiver( 48 goneReceiver, 49 IntentFilter("Gone") 50 ) 51 } 52}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/15 12:52
2021/11/15 13:01