Я получаю намерение в широковещательном приемнике, а затем начинаю службу, чтобы делать больше работы. Что делать, если устройство находится в спящем режиме, и это происходит, нужно ли мне использовать Wakelock (AlarmManger?) и зачем он мне нужен? моя служба перестанет работать, если устройство перейдет в спящий режим без активации wakelock.
BroadcastReceiver, сервис и Wakelock
Ответы (3)
Что делать, если устройство находится в спящем режиме, и это происходит, нужно ли мне использовать Wakelock (AlarmManger?) и зачем он мне нужен?
Если устройство вначале спит, вы не будете «получать намерение в широковещательном приемнике», потому что устройство спит.
мне нужно установить Wakelock (AlarmManger?) и зачем он мне нужен?
Вам это не нужно, если только вы не хотите, чтобы устройство продолжало работать, пока вы выполняете некоторую работу.
моя служба перестанет работать, если устройство перейдет в спящий режим без активации wakelock.
да.
WakeLock
. Просто не забудьте отпустить его, когда закончите.
- person CommonsWare; 15.04.2011
Intent
не будет обрабатываться. Приглашаем вас прочитать документацию по PowerManager
и PowerManager.WakeLock
, чтобы узнать больше о состояниях ЦП.
- person CommonsWare; 10.12.2014
PARTIAL_WAKE_LOCK
. IntentService также сохраняет устройство PARTIAL_WAKE_LOCK? - он тоже не держит PARTIAL_WAKE_LOCK
. Вот почему в пакете поддержки Android есть WakefulBroadcastReceiver
, а я написал WakefulIntentService
.
- person CommonsWare; 10.12.2014
Похоже, собственный WakefulBroadcastReceiver для Android был бы идеальным решением. для тебя. Необходимо расширить это, а не обычный 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);
}
указанное выше будет определено в коде вашего диспетчера аварийных сигналов, чтобы он планировал звонок
class
будет выгружен? См .: stackoverflow.com/283questions/6299 /
- person Mr_and_Mrs_D; 25.04.2013