Whatsapp のように、デバイスがスリープ状態であってもバックグラウンドで Android サービスを永続的に実行する方法のコード例が必要ですか? 質問する

Whatsapp のように、デバイスがスリープ状態であってもバックグラウンドで Android サービスを永続的に実行する方法のコード例が必要ですか? 質問する

これを実現するためにさまざまな方法を試しましたが、最終的にサービスは停止してしまいます。

AlarmManager を使用して、1 時間ごとにクラスをトリガーします。デバイスがスリープ状態の場合でも、点滅する LED アラート、振動、またはサウンドが送信される必要があります。いずれにしても、永久に実行される必要があります。

実行中のアプリをすべて終了し、メモリをクリアし、デバイスをスリープ状態にしたにもかかわらず、Whatsapp が常に実行されているのに気づきました。それでも Whatsapp はメッセージを受信して​​通知します。どうやってやっているのでしょうか? 自分のアプリでも同じことをしたいです。

ベストアンサー1

注意: この回答はAndroid 7以下にのみ有効です。Android 8以降、Googleはバックグラウンドタスクの処理方法を変更しました。

この質問を投稿してから、このソリューションに対する 2 つの異なるアプローチを複数のアプリに実装しました。


アプローチ 1

この抜粋は、デバイスを即座に起動させる必要があるプッシュ通知を使用するアプリからの抜粋です。ここで私が行っていることは、

  1. WAKE_LOCK権限を使用し、
  2. Wakelocker抽象クラスを使用する
  3. 必要に応じてアクティビティで使用します。

マニフェスト:

<uses-permission android:name="android.permission.WAKE_LOCK" />

WakeLocker クラス:

public abstract class WakeLocker {
private static PowerManager.WakeLock wakeLock;

public static void acquire(Context context) {
    if (wakeLock != null) wakeLock.release();

    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
            PowerManager.ACQUIRE_CAUSES_WAKEUP |
            PowerManager.ON_AFTER_RELEASE, "WakeLock");
    wakeLock.acquire();
}

public static void release() {
    if (wakeLock != null) wakeLock.release(); wakeLock = null;
}
}

アクティビティクラスの例:

private final BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Waking up mobile if it is sleeping
        WakeLocker.acquire(getApplicationContext());
        // do something
        WakeLocker.release();
}

アプローチ2

Android に起動の制御を与え、コードを定期的に起動しても問題ない場合に最適です。AlarmManager を使用して、定期的に Service クラスを呼び出すだけです。以下は、私の LifeLog24 アプリのコードです。

主な活動

Intent ll24 = new Intent(context, AlarmReceiverLifeLog.class);
    PendingIntent recurringLl24 = PendingIntent.getBroadcast(context, 0, ll24, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarms.setRepeating(AlarmManager.RTC_WAKEUP, first_log.getTime(), AlarmManager.INTERVAL_HOUR, recurringLl24); // Log repetition

アラームクラス

public class AlarmReceiverLifeLog extends BroadcastReceiver {

    private static final String TAG = "LL24";
    static Context context;

    @Override
    public void onReceive(Context context, Intent intent) {

        Log.v(TAG, "Alarm for LifeLog...");

        Intent ll24Service = new Intent(context, LifeLogService.class);
        context.startService(ll24Service);
    }
    }

LifeLogService.class は、私が作業を行う場所です。この場合、アラームは 1 時間ごとに起動し、BroadcastReceiver をトリガーして、サービスを実行します。サービスが 2 回実行されないようにするなど、他にも必要な作業がありますが、その方法はおわかりでしょう。また、バッテリー使用量などを気にする必要がなく、Android が定期的にサービスを起動してくれるため、AlarmManager は実際に最適な方法です。

おすすめ記事