Обработка намерений 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 с фоновой активностью или сервисом, даже если это звучит немного странно, возможно, есть некоторые веские причины для таких действий.

Вместо этого используйте Activity Transition API.

Другие вопросы по тегам