Я хочу, чтобы работник отображал уведомление, когда устройство подключено и подключено к Интернету

Хорошо, я думаю, что название говорит само за себя ... Мне нужно использовать WorkManager api, чтобы запланировать уведомление, которое будет отображаться каждый раз, когда устройство подключено к Интернету и заряжается (подключено). Мне удалось создать воркера и заставить его отображать уведомление, но проблема в том, что он показывает уведомление только один раз. После этого, даже если я отключу / повторно подключусь к Wi-Fi и отключу / подключу кабель, уведомление не будет отображаться.

val notificationTriggerConstraint = Constraints.Builder()
            .setRequiredNetworkType(NetworkType.UNMETERED)
            .setRequiresCharging(true)
            .build()
    val notificationWorker = OneTimeWorkRequest.Builder(NotificationWorker::class.java)
            .setConstraints(notificationTriggerConstraint)
            .build()

class NotificationWorker(@NonNull context: Context, @NonNull workerParameters: WorkerParameters) : Worker(context, workerParameters) {
override fun doWork(): Result {

    val notificationBuilder = NotificationCompat.Builder(applicationContext, "CHANNEL")
            .setSmallIcon(R.drawable.ic_notification)
            .setContentTitle("Background job")
            .setContentText("Device is charging and connected to WIFI")
            .setStyle(NotificationCompat.BigTextStyle().bigText("Device is charging and connected to WIFI"))
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
    val notificationManager = NotificationManagerCompat.from(applicationContext)
    notificationManager.notify(0, notificationBuilder.build())

    return Result.SUCCESS
}}

Это ограничения и рабочий, который создает уведомление. Я не могу использовать PeriodicWorkRequest, так как приложение должно работать не так. Может ли кто-нибудь предложить здесь подход? Спасибо


person Alex Tăbușcă    schedule 29.10.2018    source источник


Ответы (1)


Я не думаю, что WorkManager - лучший вариант в этом случае.

В вашем конкретном случае вы используете OneTimeWorkRequest, поэтому, как только он будет запущен WorkManager, вам нужно снова поставить его в очередь (но становится сложно поставить его в очередь только тогда, когда одно из двух ограничений ложно).

Лучшим подходом было бы использование комбинации BatteryManager и ConnectivityManager.

person pfmaggi    schedule 30.10.2018
comment
Спасибо за ответ! :) К сожалению, я был вынужден использовать только WorkManager, поэтому окончательным решением было использование периодического запроса, хотя это был не совсем идеальный подход - person Alex Tăbușcă; 19.11.2018