BroadcastReceiver, сервис и Wakelock

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


person Jimmy    schedule 15.04.2011    source источник


Ответы (3)


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

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

мне нужно установить Wakelock (AlarmManger?) и зачем он мне нужен?

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

моя служба перестанет работать, если устройство перейдет в спящий режим без активации wakelock.

да.

person CommonsWare    schedule 15.04.2011
comment
для первой части я имел в виду, что получу намерение от C2DM, которое, я думаю, вы могли бы получить, пока устройство спит. а затем я хочу запустить службу, и я думаю, мне нужно включить wakelock, чтобы она работала. эти предположения верны? - person Jimmy; 15.04.2011
comment
@Fevos: я имел в виду, что получу намерение от C2DM, которое, я думаю, вы могли бы получить, пока устройство спит. - да, C2DM использует соединение сокета по беспроводной сети (AFAIK), и входящие пакеты по этому соединению будут будить устройство на короткое время. а затем я хочу запустить службу, и я думаю, мне нужно включить wakelock, чтобы она работала. эти предположения верны? - да, захочешь свой WakeLock. Просто не забудьте отпустить его, когда закончите. - person CommonsWare; 15.04.2011
comment
Если устройство вначале спит, вы не будете получать намерение в широковещательном приемнике, потому что устройство спит. Где это задокументировано? - person Marian Paździoch; 10.12.2014
comment
@ MarianPaździoch: Где это задокументировано? - Сомневаюсь, что это задокументировано конкретно, отчасти потому, что это очевидно. Если ЦП не выполняет инструкции, ничья передача Intent не будет обрабатываться. Приглашаем вас прочитать документацию по PowerManager и PowerManager.WakeLock, чтобы узнать больше о состояниях ЦП. - person CommonsWare; 10.12.2014
comment
@CommonsWare Я бы не стал использовать слово ОЧЕРЕДНОЕ в контексте Android :). Итак, если очевидно, что BroadcastReceiver сохраняет устройство PARTIAL_WAKE_LOCK, тогда также очевидно, что IntentService также сохраняет устройство PARTIAL_WAKE_LOCK? - person Marian Paździoch; 10.12.2014
comment
@ MarianPaździoch: Итак, если очевидно, что BroadcastReceiver сохраняет устройство PARTIAL_WAKE_LOCK - он не сохраняет PARTIAL_WAKE_LOCK. IntentService также сохраняет устройство PARTIAL_WAKE_LOCK? - он тоже не держит PARTIAL_WAKE_LOCK. Вот почему в пакете поддержки Android есть WakefulBroadcastReceiver, а я написал WakefulIntentService. - person CommonsWare; 10.12.2014
comment
@CommonsWare Если устройство изначально спит, вы не будете получать намерение в широковещательном приемнике, потому что устройство спит. Я нашел здесь противоположное определение: stackoverflow.com/questions/27396766/ - person Marian Paździoch; 10.12.2014

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

startWakefulService(context, service);

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

MyWakefulReceiver.completeWakefulIntent(intent);
person dud3rino    schedule 24.08.2016

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;
            }
        }
    }
}

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

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

указанное выше будет определено в коде вашего диспетчера аварийных сигналов, чтобы он планировал звонок

person j2emanue    schedule 10.08.2012
comment
Вы уверены, что эта статическая блокировка не будет снята, когда приемник class будет выгружен? См .: stackoverflow.com/283questions/6299 / - person Mr_and_Mrs_D; 25.04.2013
comment
Я предполагаю, что объект не будет собираться сборщиком мусора, поскольку это не анонимный broadcastReceiver. Если я выделяю этот объект сам и сохраняю жесткую ссылку на него, почему он будет освобожден системой? это интересная тема посоветуйте пожалуйста. - person j2emanue; 27.04.2013