AlarmManager не работает после перезагрузки на некоторых устройствах

#android #alarmmanager #android-alarms

#Android #alarmmanager #android-сигналы тревоги

Вопрос:

Я пытаюсь создать приложение для сигнализации, в котором я хочу показывать сигналы тревоги с помощью уведомления. Все работает нормально. Но когда я пытаюсь перезапустить / перезагрузить устройство на некоторых устройствах, таких как Samsung, я вижу, что после перезагрузки назначаются сигналы тревоги, но на таких устройствах, как Realme, Redmi, он не работает (сигналы тревоги не назначаются).

Мой вопрос: «Как я могу убедиться, что тревога запланирована на каждом устройстве?»

Вот код.

AndroidManifest.xml

 <receiver
    android:name=".BootCompletedReceiver"
    android:exported="true">
    <intent-filter>
       <action android:name="android.intent.action.BOOT_COMPLETED" />
       <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
       <action android:name="android.intent.action.QUICKBOOT_POWERON" />
       <action android:name="android.intent.action.REBOOT" />
    </intent-filter>
</receiver>
<receiver android:name=".NotificationReceiver" />
 

Получатель уведомлений

 class NotificationReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, p1: Intent?) {

    val actionIntent = Intent(context, MainActivity::class.java)

    val stackBuilder: TaskStackBuilder = TaskStackBuilder.create(context)
    stackBuilder.addParentStack(MainActivity::class.java)
    stackBuilder.addNextIntent(actionIntent)

    val pendingIntent = stackBuilder.getPendingIntent(
        System.currentTimeMillis().toInt(),
        PendingIntent.FLAG_UPDATE_CURRENT
    )

    val notificationManager: NotificationManager =
        context?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    createNotificationChannel(notificationManager)
    val builder = NotificationCompat.Builder(context, "notification_channel")
        .setSmallIcon(R.drawable.ic_launcher_foreground)
        .setContentTitle("Title")
        .setAutoCancel(true)
        .setContentIntent(pendingIntent)
        .setContentText("Notification Message")
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setAutoCancel(true)

    val notification = builder.build()
    notificationManager.notify(1421, notification)
}

/**
 * Creates the notification channel.
 */
private fun createNotificationChannel(notificationManager: NotificationManager) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val channel = NotificationChannel(
            "notification_channel",
            "Sample App",
            NotificationManager.IMPORTANCE_HIGH
        )
        notificationManager.createNotificationChannel(channel)
    }
}
}
 

BootCompletedReceiver

 class BootCompletedReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, p1: Intent?) {
    val intent = Intent(context, NotificationReceiver::class.java)
    val pendingIntent = PendingIntent.getBroadcast(
        context,
        0,
        intent,
        PendingIntent.FLAG_UPDATE_CURRENT
    )
    val alarmService = context?.getSystemService(Context.ALARM_SERVICE) as AlarmManager
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        alarmService.setExactAndAllowWhileIdle(
            AlarmManager.RTC_WAKEUP,
            System.currentTimeMillis()   (300 * 1000),
            pendingIntent
        )
    } else {
        alarmService.setExact(
            AlarmManager.RTC_WAKEUP,
            System.currentTimeMillis()   (300 * 1000),
            pendingIntent
        )
    }
}
}
 

Это всего лишь пример кода, который выдает уведомление через каждые 5 минут после открытия приложения или при загрузке устройства отправляет уведомление через 5 минут.

Пожалуйста, помогите с чем-то таким, чтобы тревога была запланирована для каждого устройства.

Комментарии:

1. Это не сработает, так как есть так много вещей, которые могут убить ваше приложение в фоновом режиме. Это поможет вам понять dontkillmyapp.com/problem