app手动关闭时, AlarmManager未触发



我想确保AlarmManager被触发,即使我的应用程序是手动关闭,同样的方式一个消息应用程序仍然显示消息,即使关闭(滑动或按下"X")。这是我的代码:

class MainActivity : ComponentActivity() {
private lateinit var alarmManager: AlarmManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val mp = MediaPlayer.create(context,R.raw.music)
mp.start()
}
}
this.registerReceiver(receiver, IntentFilter("SET_ALARM"))
alarmManager = getSystemService(ALARM_SERVICE) as AlarmManager
var calendar = Calendar.getInstance()
calendar.add(Calendar.MINUTE,1)
val alarmIntent = Intent()
alarmIntent.action = "SET_ALARM"
var pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0)
Column( Modifier
.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally) {

Button(onClick = { alarmManager.setAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
calendar.timeInMillis,
pendingIntent)}) {Text("play song in 1 minute")
}

}
}
}

}

当应用程序打开时它工作得很好,但当我手动关闭它时就不行了。我还需要补充什么?

(这不是电池管理问题,因为它在模拟器中也不起作用)

在你的AndroidManifest.xml中,确保你在标签中有一个接收器定义,类似于:

& lt;接收机android: name ="AlarmReceiver"

您在评论中说您正在通过活动注册广播接收器,而不是清单。这将只接收广播,而你的应用程序实际上是运行-特别是只要你用来注册接收器的Context是有效的。如果您使用Activity作为该上下文,一旦该活动被销毁,接收器将不会收到广播(即使应用程序正在运行,例如与另一个活动)。即使你使用了应用程序上下文,一旦应用程序被销毁,它也会被清除。

From the docs:

Manifest-declared接收器

如果你在manifest中声明了一个广播接收器,系统会启动你的应用(如果应用程序尚未运行)当广播发送时

Context-registered接收器

上下文注册的接收器接收广播,只要它们的注册上下文有效。例如,如果你在Activity上下文中注册,只要Activity没有被销毁,你就会收到广播。如果你在Application上下文中注册,只要应用程序在运行,你就会收到广播.

如果你需要你的应用程序在后台启动(如果你依赖于警报,你就会这样做,这意味着你的应用程序不在前台,当警报运行时可能会被销毁),你需要在清单中注册接收器,这样系统就知道它是你的应用程序处理的东西

最新更新