Я создаю приложение, которое просто регистрирует некоторые геозоны и уведомляет пользователя, когда он входит в эти геозоны.
Чтобы достичь этого, я следил за некоторыми ресурсами * и создал соответствующий код **
Код работает правильно, и приложение получает геозонууведомления даже в фоновом режиме.
Но я хотел дополнительно протестировать свое приложение на предмет "Ограничения адаптивного приложения батареи" ***, также известного как "Резервные корзины приложений", который был представлен в Android 9+, которыйразделите приложения на 4 основных сегмента в зависимости от использования пользователя.
Чтобы добиться этого, я использовал следующие команды:
adb shell dumpsys battery unplug
adb shell am set-standby-bucket com.polygonfence frequent
Это привело к тому, что приложение переместилось в частый пакет.
Проблема заключается в том, что всякий раз, когда я перемещаю свое приложение в редкий или частый пакет, я прекращаю получать обновления. Независимо от того, сколько раз я вхожу и покидаю забор (для входа и выхода я использую поддельное приложение gps ****)
Чтобы начать получать обновления, мне нужно было либо переместить мое приложение в (активное или работающее_сетевое) , либо повторно подключить питание
adb shell am set-standby-bucket com.polygonfence active
adb shell dumpsys battery reset
такое поведение ожидается? Или в моем коде что-то отсутствует? или я тестирую неправильно?
Последнее замечание: на моем персональном устройстве я был удивлен, что даже youtube считается частым приложением, поэтому я не думаю, чточто мое приложение останется активным или рабочим сегментом для большинства пользователей.
ресурсы *
https://developer.android.com/training/location/geofencing
https://www.raywenderlich.com/7372-geofencing-api-tutorial-for-android
код **
class GeofenceHandler(val context: Context) {
private val geofencingClient = LocationServices.getGeofencingClient(context)
private val geofencePendingIntent: PendingIntent by lazy {
val intent = Intent(context, GeofenceBroadcastReceiver::class.java)
PendingIntent.getBroadcast(
context,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT)
}
@SuppressLint("MissingPermission")
fun add(fenceEntry: FenceEntry,
success: (reminder: FenceEntry) -> Unit,
failure: (error: String) -> Unit) {
val geofence = buildGeofence(fenceEntry)
geofencingClient
.addGeofences(buildGeofencingRequest(geofence), geofencePendingIntent)
.addOnSuccessListener {
Repo().saveFence(context ,fenceEntry )
success(fenceEntry)
}
.addOnFailureListener {
failure(GeofenceErrorMessages.getErrorString(context, it))
}
}
private fun buildGeofence(fenceEntry: FenceEntry): Geofence {
val latitude = fenceEntry.latLng.latitude
val longitude = fenceEntry.latLng.longitude
val radius = fenceEntry.radius
return Geofence.Builder()
.setNotificationResponsiveness(1 * 60 *1000)
.setRequestId(fenceEntry.id)
.setCircularRegion(
latitude,
longitude,
radius.toFloat()
)
.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER)
.setExpirationDuration(Geofence.NEVER_EXPIRE)
.build()
}
private fun buildGeofencingRequest(geofence: Geofence): GeofencingRequest {
return GeofencingRequest.Builder()
.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER)
.addGeofences(listOf(geofence))
.build()
}
}
class GeofenceBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
GeofenceTransitionsJobIntentService.enqueueWork(context, intent)
}
}
"Ограничения использования адаптивного аккумулятора" ***
https://developer.android.com/about/versions/pie/power#buckets
https://www.youtube.com/watch?v=-7eZL3XRqas&t=256s
поддельное приложение gps ****
https://play.google.com/store/apps/details?id=com.lexa.fakegps&hl=en