BroadcastReceiver, Сервис и Wakelock

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

3 ответа

Решение

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

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

я должен получить Wakelock (AlarmManger?), и зачем он мне нужен?

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

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

Да.

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

startWakefulService(context, service);

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

MyWakefulReceiver.completeWakefulIntent(intent);
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);
}

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

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