Вам понадобится будильник, и я также сделаю ваш сервис приоритетным. Это снизит вероятность того, что Android убьет ваше приложение или службу. На самом деле в соответствии с Background Location Limits не сказано, что вам нужен wakelock - только приоритетный сервис. Заставляя ваше приложение непрерывно работать в фоновом режиме, вы заставите его быстро разряжать пользовательскую батарею - что плохо. Подумайте об использовании пассивных обновлений местоположения, это может произойти несколько раз в час, а это может быть не то, что вам нужно.
Возможно, вы также захотите прочитать о режиме ожидания , который заставляет все приложения, не занесенные в белый список, игнорировать блокировки пробуждения в режиме отключения экрана.
Чтобы добавить блокировку от пробуждения:
val mgr = service.getSystemService(Context.POWER_SERVICE) as PowerManager
val wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "myAppName:MyWakeLock")
wakeLock.acquire()
in onDestroy
:
wakeLock.release()
Используйте приведенный ниже код, чтобы добавить уведомление в панель уведомлений и сделать сервис приоритетным. Вы должны добавить addServiceNotification(this)
в свой onStartCommand
.
fun addServiceNotification(service: Service) {
val mgr = NotificationManagerCompat.from(service)
val title = "Caption"
val text = "Location"
if (Build.VERSION.SDK_INT >= 26) {
val notificationManager = service.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (notificationManager != null) {
var mChannel: NotificationChannel? = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID)
if (mChannel == null) {
mChannel = NotificationChannel(NOTIFICATION_CHANNEL_ID, "myAppName", NotificationManager.IMPORTANCE_LOW)
notificationManager.createNotificationChannel(mChannel)
}
}
val notification = NotificationCompat.Builder(service, NOTIFICATION_CHANNEL_ID)
.setSmallIcon(R.drawable.app_icon)
.setTicker(title)
.setWhen(System.currentTimeMillis())
.setContentTitle(title)
.setContentText(text)
.setOnlyAlertOnce(true)
.setOngoing(true)
.build()
service.startForeground(LOCATION_NOTIFICATION_ID, notification)
mgr.cancel(LOCATION_NOTIFICATION_ID)
mgr.notify(LOCATION_NOTIFICATION_ID, notification)
}
}
// remove notification for location service
fun removeServiceNotification(service: Service) {
val notificationManager = service.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager?.cancel(LOCATION_NOTIFICATION_ID)
}
companion object {
val LOCATION_NOTIFICATION_ID = 1001
val NOTIFICATION_CHANNEL_ID = "myAppName"
}