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

Posted

技术标签:

【中文标题】Android在另一个完成时设置警报管理器【英文标题】:Android set alarm manager when another is finished 【发布时间】:2021-09-21 02:41:29 【问题描述】:

我尝试使用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());

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

【问题讨论】:

【参考方案1】:

您需要在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 连接,定时通知也能正常工作。但是,不能保证一直工作。

【讨论】:

【参考方案2】:

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

移动代码以在自己的类中从MainActivity 设置警报

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>

【讨论】:

以上是关于Android在另一个完成时设置警报管理器的主要内容,如果未能解决你的问题,请参考以下文章

Android 警报管理器在重新启动设备或从后台杀死应用程序后取消

MainActivity 中的 Android 类没有收到来自警报管理器的广播

当应用程序处于打盹模式时,警报管理器触发的 Android 通知未触发

Xamarin 警报管理器 Android

Android 6.0 处于打盹模式时如何让闹钟管理器工作?

在Android警报管理器中设置时间-立即触发警报[重复]