これを達成するためにさまざまな方法を試しましたが、私のサービスは最終的に殺されます。
AlarmManagerを使用して、1時間ごとにクラスをトリガーします。デバイスがスリープ状態であっても、点滅するLEDアラート、振動、または音を送信する必要があります。いずれにせよ、それは永遠に実行する必要があります。
実行中のすべてのアプリを強制終了し、メモリをクリアし、デバイスをスリープ状態にし、Whatsappがメッセージを受信して警告を発したにもかかわらず、Whatsappが常に実行されていることに気付きました。彼らはどうやっているの?私も自分のアプリで同じことをしたいです。
この質問を投稿してから、このソリューションへの2つの異なるアプローチを複数のアプリに実装しました。
アプローチ1
この抽出は、プッシュ通知を使用するアプリからのものです。プッシュ通知を使用するには、デバイスの即時起動コールが必要です。ここで私がやることは
マニフェスト:
<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が実際に最適な方法です。
とても簡単です。
手順:
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));
}
}
これらの簡単な手順に従って、Androidデバイスでサービスを無期限に維持します。1。アラームマネージャーを使用してサービスを呼び出します。 startServiceメソッドを使用してサービスを再起動します4.(オプション)onTaskRemovedメソッドでポイント番号3を繰り返します。
部分的な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;
}