2

I tried to use the setRepeating of AlarmManager, and then I read that the method isn't working anymore in API 26+, so the another solution was to schedule each alarm when the previous is finish. How can I do that?

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());
}

How can i create another alarm manager when the previous is finish?

Ziv Sion
  • 424
  • 4
  • 14

2 Answers2

0

Here is example to make alarm every 2 minutes (tested on API 30)

move code to set alarm from MainActivity in own class

public class AlarmExecutor {

    public static void makeAlarm(Context context, int minute) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.MINUTE, minute);

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

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

        AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

        Log.d("Testing", "make alarm at " + calendar.getTime().toString());
    }
}

now you can add in

  • Notification_receiver.java after notificationManager.notify(time, builder.build());
  • MainActivity

following line

// make alarm in 2 minutes
AlarmExecutor.makeAlarm(context, 2);

that will make an alarm every 2 minutes.

And don't forget to register the receiver in Manifest

<application >
    <receiver android:name=".yourReceiver" />

</application>
anatoli
  • 1,663
  • 1
  • 17
  • 43
0

You will need to schedule your next alarm, at the end of BroadcastReceiver

public class AlarmBroadcastReceiver extends BroadcastReceiver {

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

Please note that, due to different battery saving mechanism implemented by different OEMs, AlarmManager is not guarantee to work all the time. Please refer to https://issuetracker.google.com/issues/122098785

In short, AlarmManager is the current best available mechanism, for timed notification to work, even without Internet connection. But, it is not gurantee to work all the time.

Cheok Yan Cheng
  • 47,586
  • 132
  • 466
  • 875