Периодическая работа выполняется только тогда, когда приложение работает в Android API 28 - PullRequest
0 голосов
/ 01 октября 2019

Я тестировал один и тот же код на уровне API 24 и 28. С API 24 он показывает уведомления каждые полчаса, независимо от того, находится ли приложение в фоновом режиме или на переднем плане или даже остановлено. Но с API 28 он показывает уведомления каждые полчаса, когда приложение находится на переднем плане. Когда приложение находится в фоновом режиме, оно показывает уведомления через случайные длинные интервалы. Когда приложение остановлено, оно никогда не показывает уведомления. Как создать приложение, которое показывает регулярные уведомления в новых версиях Android? Я пытался использовать WorkManger и NotificationManagerCompat. Версия WorkManager - последняя версия 2.2.0. Код, который я тестировал, прост, я получил его из официальной документации:

class MainActivity : AppCompatActivity() {

    companion object {
        const val CHANNEL_ID = "channel_id_1"
    }

    class MyWorker(context: Context, workerParams: WorkerParameters) 
        : Worker(context, workerParams ) { 

        override fun doWork(): Result {
            var builder = NotificationCompat.Builder(applicationContext, MainActivity.CHANNEL_ID)
                .setSmallIcon(R.drawable.ic_launcher_foreground)
                .setContentTitle("notificattion")
                .setContentText("notification")
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)

            with(NotificationManagerCompat.from(applicationContext)) {
                // notificationId is a unique int for each notification that you must define
                notify(ThreadLocalRandom.current().nextInt(1, 1000), builder.build())
            }

            return Result.success()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        createNotificationChannel()

        val myWork = PeriodicWorkRequestBuilder<MyWorker>(30, TimeUnit.MINUTES).build()

        WorkManager.getInstance(this).enqueueUniquePeriodicWork(
            "MyUniqueWorkName",
            ExistingPeriodicWorkPolicy.KEEP, myWork)
    }

    private fun createNotificationChannel() {
        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val importance = NotificationManager.IMPORTANCE_DEFAULT
            val channel = NotificationChannel(CHANNEL_ID, "channel mine", importance).apply {
                description = "description"
            }
            // Register the channel with the system
            val notificationManager: NotificationManager =
                getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.createNotificationChannel(channel)
        }
    }
}
...