我遇到了与AlarmManager有关的问题,可以将其复制如下: 1.安装并打开该应用程序。 2.以10分钟内设置一个闹钟为例。 3.在预计会触发警报之前终止应用程序。
警报通知将不会在预期的时间显示。在以下情况下,不会出现此问题,并且警报将正常触发: 答:我不会杀死该应用程序并将其保持打开状态或在后台运行,或者 B:杀死该应用程序后,请在10分钟内重新打开同一应用程序。然后,无论我将应用保持打开状态还是再次杀死它,闹钟都会在10分钟标记处正常触发。
我的BootReceiver也发生了同样的事情,即,为了使警报出现,我要么必须在设备重新引导时将应用程序置于后台,要么必须在重新引导之前再次杀死该应用程序。 / p>
我的代码基于Google CodeLabs。
清单
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
<receiver
android:name=".receiver.AlarmReceiver"
android:enabled="true">
</receiver>
<receiver
android:name=".receiver.SnoozeReceiver"
android:enabled="true">
</receiver>
MyApplication.kt
override fun onCreate() {
super.onCreate()
createChannel(applicationContext,
getString(R.string.notification_channel_id),
getString(R.string.notification_channel_name)
)
}
AlarmReceiver
class AlarmReceiver : BroadcastReceiver() {
@Inject
lateinit var notificationManager: NotificationManager
@Inject
lateinit var repository: MyRepository
override fun onReceive(context: Context, intent: Intent) {
AndroidInjection.inject(this, context)
notificationManager.sendNotification(
intent.extras!!,
context,
repository
)
}
}
NotificationUtils.kt
fun NotificationManager.sendNotification(
bundle: Bundle,
applicationContext: Context,
repository: MyRepository
) {
/*setup notification content and layout*/
notify(id, builder.build())
}
fun createChannel(applicationContext: Context, channelId: String, channelName: String) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationChannel = NotificationChannel(
channelId,
channelName,
NotificationManager.IMPORTANCE_HIGH
)
.apply {
setShowBadge(false)
}
notificationChannel.enableLights(true)
notificationChannel.lightColor = Color.RED
notificationChannel.enableVibration(false)
notificationChannel.description = applicationContext.getString(R.string.notification_channel_description)
val notificationManager = applicationContext.getSystemService(
NotificationManager::class.java
)
notificationManager?.createNotificationChannel(notificationChannel)
}
}
我在AVD API 29和30上对此进行了测试,并看到了相同的问题。我还通过在应用打开后立即发出警报进行了测试,这可能表明通知通道运行正常。我非常感谢您的帮助。