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);
}
Вышеуказанное будет определено в вашем коде тревоги, чтобы он планировал вызов