Я тестировал один и тот же код на уровне 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)
}
}
}