1. ホーム
  2. android

[解決済み] Androidで別件が終了したらアラームマネージャーを設定する

2022-02-28 16:18:14

質問

を使おうとしたのですが setRepeatingAlarmManager そして、この方法はAPI 26+ではもう機能していないことを読みました。したがって、別の解決策は、前のアラームが終了したときに各アラームをスケジュールすることでした。どうすればいいでしょうか?

MainActivity.java

 public class MainActivity extends AppCompatActivity {
calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());

calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour.getText().toString()));
calendar.set(Calendar.MINUTE, Integer.parseInt(minute.getText().toString()));
calendar.set(Calendar.SECOND, 00);


Intent intent = new Intent(getApplicationContext(), Notification_receiver.class);

pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}

Notification_reciever.java

public class Notification_receiver extends BroadcastReceiver {
NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);

        Intent repeating_intent = new Intent(context, MainActivity.class);

        repeating_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, time, repeating_intent, PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
                .setContentIntent(pendingIntent)
                .setChannelId(CHANNEL_ID)
                .setSmallIcon(R.drawable.ic_baseline_notifications_active_24)
                .setContentTitle("Notification Title")
                .setContentText("Notification Text")
                .setAutoCancel(true);


        notificationManager.notify(time, builder.build());
}

前のアラームが終了した後、別のアラームマネージャーを作成するにはどうすればよいですか?

解決方法は?

次のアラームをスケジュールする必要があります。 BroadcastReceiver

public class AlarmBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        ...
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nextAlarmTimeInMillis(), pendingIntent);

OEMによって実装されているバッテリー節約メカニズムが異なるため、ご注意ください。 AlarmManager は、常に動作することを保証するものではありません。下記をご参照ください。 https://issuetracker.google.com/issues/122098785

要するに AlarmManager は、インターネットに接続されていない状態でも時間指定通知が機能する、現在利用可能な最良のメカニズムです。しかし、常に動作することを保証するものではありません。