Android 设置另一个完成时的警报管理器

Android set alarm manager when another is finished

我尝试使用 AlarmManagersetRepeating,然后我读到该方法在 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());
}

如何在上一个警报管理器完成后创建另一个警报管理器?

这是每 2 分钟发出一次警报的示例(在 API 30 上测试)

MainActivity 移动代码以在自己的 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());
    }
}

现在您可以添加

  • Notification_receiver.javanotificationManager.notify(time, builder.build());
  • 之后
  • 主要活动

下一行

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

每 2 分钟发出一次警报。

并且不要忘记在 Manifest

中注册接收器
<application >
    <receiver android:name=".yourReceiver" />

</application>

您需要安排下一个闹钟,在 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 是当前最好的可用机制,即使没有 Internet 连接,定时通知也能正常工作。但是,不能保证一直工作。