2011-04-15 5 views
4

im, получающий намерение в широковещательном приемнике, а затем я начинаю сервис, чтобы сделать больше работы. теперь, что, если устройство сон, и это произойдет, я должен получить Wakelock (AlarmManger?) и зачем мне это нужно? ли мой сервис перестанет работать, если устройство отправится спать, не получив wakelock.BroadcastReceiver, Service и Wakelock

ответ

5

Теперь что, если устройство сна, и это произойдет, мне нужно получить Wakelock (AlarmManger?) И зачем мне это нужно?

Если устройство с самого начала спит, вы не будете «получать намерение в широковещательном приемнике», поскольку устройство спит.

Мне нужно получить Wakelock (AlarmManger?) И зачем мне это нужно?

Вы не нуждаетесь в нем, если не хотите, чтобы устройство работало, пока вы выполняете какую-либо работу.

ли мой сервис прекратит работать, если устройство отправляется спать, не получая вакелон.

Да.

+0

для первой части, я имел в виду, что получаю намерение от C2DM, которое, я думаю, вы могли получить его, пока устройство спит. и затем я хочу запустить службу, и я думаю, мне нужно заставить wakelock поддерживать ее работу. это предположение верно? – Jimmy

+0

@Fevos: «Я имел в виду, что получаю намерение от C2DM, которое, я думаю, вы можете получить его, пока устройство спит». - да, C2DM использует соединение сокета по беспроводным данным (AFAIK), а входящие пакеты на этом соединении быстро пробудят устройство *. ", а затем я хочу запустить службу, и я думаю, мне нужно заставить wakelock продолжать ее работу. Это предположение верно?" - да, вам понадобится собственный 'WakeLock'. Просто не забудьте освободить его, когда закончите. – CommonsWare

+0

Отлично! Благодарю. – Jimmy

0
public class WakeLockManager extends BroadcastReceiver { 

    private static WakeLock mWakeLock; 
    private String LCLT; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Consts.WAKELOCK_INTENT)) { 
      Log.v("wakelock", "GOT THE wakelock INTENT"); 
      boolean on = intent.getExtras().getBoolean("on"); 
      if (mWakeLock == null) { 
       PowerManager pm = (PowerManager) context 
         .getSystemService(Context.POWER_SERVICE); 
       mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
         "Breeze WakeLock"); 
      } 
      if (on) { 
       if (!mWakeLock.isHeld()) { 
        mWakeLock.acquire(); 
        Log.v("wakelock", "acquiring wakelock"); 
       } 
      } else { 
       if (mWakeLock.isHeld()) { 
        Log.v("wakelock", "releasing wakelock"); 
        mWakeLock.release(); 
       } 
       mWakeLock = null; 
      } 
     } 
    } 
} 

взгляд на приведенный выше код ..put в отдельном файле класса и и в манифесте определить его для некоторого пользовательского намерения .... теперь, что этот класс будет реагировать на пользовательские намерения ... просто вещать, что намерение, и вы можете включить wakelock или отключить в целом приложение, так как wakelock является static..like это:

public void setWakeup(boolean status) { 
    Intent wakelock_Intent = new Intent(CUSTOM_INTENT); 
    wakelock_Intent.putExtra("on", status); 
    this.sendBroadcast(wakelock_Intent); 
} 

вышеприведенным будет определяться в коде alarmmanager так что это в расписании звонков

+0

Вы уверены, что это " статическая блокировка "не будет удалена, когда класс-приемник будет выгружен? Смотрите: http://stackoverflow.com/questions/6299283/broadcastreciever-life-cycle-static-variables#comment7376537_6299862 –

+0

Я предполагаю, что объект не будет собираться с мусором, поскольку это не анонимный широковещательный приемник. Если я сам выделяю этот объект и поддерживаю жесткую ссылку на него, почему он освобождается системой? это интересная тема, пожалуйста, сообщите. – j2emanue

1

Похоже, что родной Android WakefulBroadcastReceiver будет идеальным решением для вас. Нужно расширить это, а не на регулярной BroadcastReceiver и запустить службу в OnReceive() в «бодрствующем» манере:

startWakefulService(context, service); 

и сигнализировать ваша работа выполняется в onHandleIntent сервиса() , позвонив по телефону

MyWakefulReceiver.completeWakefulIntent(intent); 
Смежные вопросы