Android在另一个完成时设置警报管理器
Posted
技术标签:
【中文标题】Android在另一个完成时设置警报管理器【英文标题】:Android set alarm manager when another is finished 【发布时间】:2021-09-21 02:41:29 【问题描述】:我尝试使用AlarmManager
的setRepeating
,然后我读到该方法在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.java
在notificationManager.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 通知未触发