Диспетчер работы полностью зависит от производителя. Некоторые производители или вы также можете сказать, что устройства со стандартным ПЗУ позволяли диспетчеру работы работать так, как это должно быть, но есть некоторые производители устройств («китайские ПЗУ»), которые были очень агрессивны при очисткефоновые приложения, они даже убивают менеджера работы, однако Google пытается заставить менеджер работы нормально работать на всех устройствах, общаясь с OEM.
На данный момент Если вы действительно хотите что-то запустить вВ фоновом режиме вы можете включить опцию автозапуска в xiaomi и некоторых других устройствах, или же вы можете также показать уведомление в трее уведомлений, которое заставляет приложение работать на переднем плане.вы можете проверить, работает ли приложение в фоновом режиме или нет, если нет, вы можете перезапустить его.
if (!isServiceRunning(this, MyService::class.java)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(Intent(this, MyService::class.java))
} else {
startService(Intent(this, MyService::class.java))
}
}
private fun isServiceRunning(context: Context, serviceClass: Class<*>): Boolean {
val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val services = activityManager.getRunningServices(Integer.MAX_VALUE)
if (services != null) {
for (i in services.indices) {
if (serviceClass.name == services[i].service.className && services[i].pid != 0) {
return true
}
}
}
return false
}
val am = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val pi = PendingIntent.getBroadcast(
applicationContext,
34,
Intent(this, MyBroadcastReceiver::class.java),
PendingIntent.FLAG_UPDATE_CURRENT
)
am.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, pi)
И, наконец, в приемнике Broadcast.
override fun onReceive(context: Context?, intent: Intent?) {
Handler(Looper.getMainLooper()).post {
if (!isServiceRunning(context!!, MyService::class.java)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(Intent(context, MyService::class.java))
} else {
context.startService(Intent(context, MyService::class.java))
}
}
val am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val pi = PendingIntent.getBroadcast(
context, 34, Intent(context, MyBroadcastReceiver::class.java),
PendingIntent.FLAG_UPDATE_CURRENT
)
am.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pi)
}
}