Я разрабатываю приложение, в котором я имеюAndroid, использовать/не делать блокировки при поступлении сообщения от GCM и хотите выполнять работу вне onReceive, если устройство находится в глубоком спящем режиме?
служба, которая делает запросы HTTP и записывает данные в БД
приемник объявил в манифесте, который прослушивает для GCM сообщений
приемник, заявленный в коде (в Сервисе), используемый для «разговора» с услугой
Каждый раз, когда я получаю сообщение GCM, я хочу извлечь данные из намерения и передать его службе. Затем служба будет запрашивать HTTP-сервер, получать ответ и вставлять данные в db.
Теперь я боюсь, что если телефон находится в глубоком сне, телефон будет просыпаться только до тех пор, пока GCM onReceive не исполнится, и пока моя служба не будет работать. Вот мой GCM приемник OnReceive:
@Override
public void onReceive(Context context, Intent intent) {
String url = extractUrl(intent.getExtras());
Intent serviceIntent = new Intent(context, MyService.class);
serviceIntent.setAction(MyService.ACTION_DO_WORK);
Bundle data = new Bundle();
data.putString(MyService.URL_KEY, url);
LocalBroadcastManager.getInstance(context).sendBroadcast(serviceIntent);
}
У меня есть чувство, что я должен использовать блокировку центрального процессора (поправьте меня, если я mistakeing)
Где я должен получить частичную блокировку бодрствования? Должен ли я приобрести его здесь, а затем отпустить его в моем Сервис, после того, как он выполнит эту работу? (Это безопасно получить блокировку в одном месте и выпустить его в другом)
Спасибо,
Я думаю, что вы правы; это похоже на получение сообщения от [AlarmManager - проверка второго абзаца под документами для этого] (http://developer.android.com/reference/android/app/AlarmManager.html); он описывает, используя именно ту стратегию, которую вы предлагаете защитить от спящего телефона до того, как ваша служба что-то сделает. –
Привет, Мэтт, у меня проблемы, потому что я не знаю, должен ли я получить блокировку в Сервисе. Возможно, Android возобновит сон как можно скорее, поскольку onReceive будет завершен, поэтому доставка сообщения в службу никогда не произойдет. Если это так, мне, возможно, придется приобрести блокировку в GCM onReceive и выпустить ее в Service. Хотя, я не знаю, правильно ли это, а не как это сделать, так как каждый раз вы получаете новый экземпляр WakeLock. – adragomir