Обработка намерений ActivityRecognition.API, когда приложение неактивно
Я ищу общий дизайн для реализации этого:
Я хочу зарегистрироваться в API ActivityRecognition, чтобы получать регулярные обновления в IntentService, периодически вызываемом этим API, в то время как все остальное в моем приложении полностью неактивно (цель здесь - избежать чрезмерного расхода заряда аккумулятора устройства).
Проблема в том, что с новым дизайном API ActivityRecognition он привязан к клиенту GooglePlayServices, например, так:
ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(
myGoogleApiClient,
3000L,
myActivityRecognitionPendingIntent);
И логически, этот клиент исчезает, если деятельность или служба, которая его создала, уничтожается, что приводит к потере любых обновлений ActivityRecognition.
Очевидно, что все может пойти хорошо, если я буду поддерживать службу (или активность), постоянно удерживая клиент GooglePlayServices, используемый для запуска API ActivityRecognition (в этом примере myGoogleApiClient)... Но это то, чего я хочу избежать...
Как этого достичь?
2 ответа
Вы можете посмотреть на менеджер аварийных сигналов и найти компромиссные решения, см. https://developer.android.com/training/scheduling/alarms.html
Если API автоматически активируется только в соответствующее время, гораздо более эффективным решением является попытка использования широковещательного приемника. Если вам требуется, чтобы устройство оставалось активным, почему вы обрабатываете, вы должны посмотреть на https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html
После дальнейшего тестирования и использования обновленных GooglePlayServices (9.0.2) это выглядит невыполнимой задачей. Я решил эту проблему, создав липкий сервис, который всегда работает в фоновом режиме и выполняет только одно: поддержание соединения с GoogleApiClient. Надеюсь, это не потребует слишком много энергии...
Без этого убийство GoogleApiClient приводило к странным и непоследовательным ошибкам и поведению в зависимости от версии Android и устройства, на котором он работал: в 30% случаев он работал нормально, в противном случае приложение зависало, поэтому определенно нет надежный.
В конце концов, похоже, что GooglePlayServices спроектированы таким образом: нам нужно поддерживать соединение с GoogleApiClient с фоновой активностью или сервисом, даже если это звучит немного странно, возможно, есть некоторые веские причины для таких действий.