放送受信機でインテントを受信してから、サービスを開始してさらに作業を行います。デバイスがスリープ状態でこれが発生した場合、Wakelock(AlarmManger?)を取得する必要がありますか?また、なぜそれが必要なのですか?デバイスがウェイクロックを取得せずにスリープ状態になると、サービスの実行が停止しますか?
3 に答える
デバイスがスリープ状態でこれが発生した場合、Wakelock(AlarmManger?)を取得する必要がありますか?また、なぜそれが必要なのですか?
そもそもデバイスがスリープ状態の場合、デバイスがスリープ状態であるため、「ブロードキャストレシーバーでインテントを受信」することはありません。
Wakelock(AlarmManger?)を入手する必要がありますか?なぜそれが必要なのですか?
作業を完了している間、デバイスの実行を維持したい場合を除いて、「必要」はありません。
デバイスがウェイクロックを取得せずにスリープ状態になると、サービスの実行が停止しますか?
はい。
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;
}
}
}
}
上記のコードを見てください..別のクラスファイルに入れて、マニフェストでカスタムインテント用に定義してください....このクラスがカスタムインテントに応答するようになりました...そのインテントをブロードキャストするだけで、ターンできますウェイクロックは静的であるため、アプリ全体でウェイクロックがオンまたはオフになります。次のようになります。
public void setWakeup(boolean status) {
Intent wakelock_Intent = new Intent(CUSTOM_INTENT);
wakelock_Intent.putExtra("on", status);
this.sendBroadcast(wakelock_Intent);
}
上記はalarmmanagerコードで定義されるため、呼び出しがスケジュールされます