2013-12-21 5 views
0

Я разрабатываю приложение, в котором я имею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)

Где я должен получить частичную блокировку бодрствования? Должен ли я приобрести его здесь, а затем отпустить его в моем Сервис, после того, как он выполнит эту работу? (Это безопасно получить блокировку в одном месте и выпустить его в другом)

Спасибо,

+0

Я думаю, что вы правы; это похоже на получение сообщения от [AlarmManager - проверка второго абзаца под документами для этого] (http://developer.android.com/reference/android/app/AlarmManager.html); он описывает, используя именно ту стратегию, которую вы предлагаете защитить от спящего телефона до того, как ваша служба что-то сделает. –

+0

Привет, Мэтт, у меня проблемы, потому что я не знаю, должен ли я получить блокировку в Сервисе. Возможно, Android возобновит сон как можно скорее, поскольку onReceive будет завершен, поэтому доставка сообщения в службу никогда не произойдет. Если это так, мне, возможно, придется приобрести блокировку в GCM onReceive и выпустить ее в Service. Хотя, я не знаю, правильно ли это, а не как это сделать, так как каждый раз вы получаете новый экземпляр WakeLock. – adragomir

ответ

1

Где я должен получить частичную блокировку бодрствования?

В идеале, вы позволяете некоторые испытания код сделать это, используя WakefulBroadcastReceiver или my WakefulIntentService.

Оба эти приобретет WakeLock во время вызова onReceive() и устроит выпустить WakeLock, когда ваш IntentService завершает свою работу.

+0

Привет, к сожалению, моя служба запускается из-за активности и запускается в фоновом режиме (START_STCIKY). Поэтому он не будет запущен из приемника. Как вы можете видеть, приемник отправит сообщение службе, и все. Как можно гарантировать, что служба завершит свою работу до того, как Android снова будет спать, в этой моей ситуации? – adragomir

+0

@ user3030447: «Как убедиться, что служба завершит работу до того, как Android снова перейдет спать» - похоже, вы пытаетесь запустить свой сервис все время, что является анти-шаблоном на Android ,Помимо этого, если вам не нравятся «WakefulIntentService» и «WakefulBroadcastReceiver», вы можете изучить их код, чтобы посмотреть, как они обрабатывают «WakeLock», поэтому вы можете определить, как лучше всего адаптировать его к вашему сценарию. – CommonsWare

+0

WhatsApp использует запущенную службу ... Я имею в виду, что я не вижу, что не так, когда работает перезапускаемая служба все время ... Я кодирую чат-клиент btw :) – adragomir

 Смежные вопросы

  • Нет связанных вопросов^_^