web-dev-qa-db-ja.com

Whatsappのようにデバイスがスリープしているときでも、バックグラウンドで永遠にAndroidサービスを実行する方法のコード例が必要ですか?

これを達成するためにさまざまな方法を試しましたが、私のサービスは最終的に殺されます。

AlarmManagerを使用して、1時間ごとにクラスをトリガーします。デバイスがスリープ状態であっても、点滅するLEDアラート、振動、または音を送信する必要があります。いずれにせよ、それは永遠に実行する必要があります。

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

24
zeeshan

この質問を投稿してから、このソリューションへの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を使用して定期的にサービスクラスを呼び出すだけです。 LifeLog24アプリ:

MainActivity

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回実行されないようにするためなど、他にもありますが、それがどのように行われるかがわかります。また、AlarmManagerは、バッテリーの使用量などを気にせず、Androidが定期的にサービスの起動を処理するため、AlarmManagerが実際に最適な方法です。

25
zeeshan

とても簡単です。
手順:
1.Serviceクラスを作成します。
2.BroadcastReceiverクラスを作成する
3。onDestroyサービスメソッドでBroadReceiverを呼び出す
4.In onReceive BroadReceiverクラスのメソッドがサービスをもう一度開始します。

ここにコードがあります

マニフェストファイル: `

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:roundIcon="@mipmap/ic_launcher_round"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">

    <activity Android:name=".LauncherActivity">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service
        Android:name=".utilities.NotificationService"
        Android:enabled="true">

    </service>

    <receiver
        Android:name=".utilities.RestartService"
        Android:enabled="true"
        Android:exported="true"
        Android:label="RestartServiceWhenStopped"
        Android:permission="Android.permission.RECEIVE_BOOT_COMPLETED">
        <intent-filter>
            <action Android:name="RestartService" />
        </intent-filter>
    </receiver>
</application>

`

サービスクラス

public class NotificationService extends Service {
    public NotificationService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
       super.onStartCommand(intent, flags, startId);
       return START_STICKY;
   }

   @Override
   public void onDestroy() {
       super.onDestroy();
       Intent restartService = new Intent("RestartService");
       sendBroadcast(restartService);
  }
}

BroadcastReceiverクラス

public class RestartService extends BroadcastReceiver {

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

         context.startService(new Intent(context,NotificationService.class));
     }
 }
8
Vignesh VRT

これらの簡単な手順に従って、Androidデバイスでサービスを無期限に維持します。1。アラームマネージャーを使用してサービスを呼び出します。 startServiceメソッドを使用してサービスを再起動します4.(オプション)onTaskRemovedメソッドでポイント番号3を繰り返します。

1

部分的なWakeLockを要求します。

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

 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");
mWakeLock.acquire();

onStartCommand retrun START_STICKY:

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId); 
        return START_STICKY;
    }
0
Basbous