当我将提醒时间设置为几分钟时,将显示一条通知。但是,如果时间超过一小时,则不会显示通知。
当我每隔24小时使用alarm.setRepeating
时,效果很好,但我不想重复用户提醒。
如何解决?
AddReminder.java
Intent nIntent = new Intent(MainActivity.context, ReminderReceiver.class);
nIntent.putExtra("ID", newID);
nIntent.putExtra("TITTLE", getString(R.string.reminder));
nIntent.putExtra("TEXT", name);
PendingIntent alarmIntent = PendingIntent.getBroadcast(MainActivity.context, 0, nIntent, 0);
AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
date.set(Calendar.SECOND, 0);
alarm.set(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), alarmIntent);
ReminderReceiver.java
@Override
public void onReceive(Context context, Intent intent) {
int notificationId = intent.getIntExtra("ID", 0);
String message = intent.getStringExtra("TEXT");
String tittle = intent.getStringExtra("TITTLE");
Intent mainIntent = new Intent(context, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, mainIntent, 0);
NotificationManager notificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(context);
builder.setSmallIcon(R.drawable.finance43)
.setContentTitle(tittle)
.setContentText(message)
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
.setShowWhen(true)
.setContentIntent(contentIntent)
.setPriority(Notification.PRIORITY_HIGH)
.setCategory(Notification.CATEGORY_MESSAGE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String channelId = "REMINDERS";
NotificationChannel channel = new NotificationChannel(channelId,
context.getResources().getString(R.string.reminders),
NotificationManager.IMPORTANCE_HIGH);
notificationManager.createNotificationChannel(channel);
builder.setChannelId(channelId);
}
notificationManager.notify(notificationId, builder.build());
}
答案 0 :(得分:2)
您需要考虑以下几点:
AlarmManager.set
的文档规定以下内容:
如果已经为同一个IntentSender安排了警报,则该先前的警报将首先被取消
这意味着,如果在设置警报后用意图和未决意图的相同组合设置了另一个警报,则先前的警报将被取消。确保您的意图是唯一的,除非您打算“替换”现有警报
使用AlarmManager.set
,AlarmManager.setInexactRepeating
方法(可能还有更多方法)来配置不精确的警报。不精确的警报不一定会在您期望的确切时间触发。如文档中所述,此行为是在API级别19中引入的:
从API 19开始,传递给此方法的触发时间被视为不准确:警报不会在此时间之前发送,但是可能会延迟并在以后的某个时间发送
如果要在请求时准确触发警报,请使用setExact
当系统关闭时,所有警报将被取消。换句话说,如果重新启动或关闭设备电源,警报也会被取消。重复发出警报是一个例外,一旦设备启动,它们就会全部触发。
请确保您跟踪正在运行的警报,然后注册BroadCastReceiver
以收听系统发出的android.intent.action.BOOT_COMPLETED
广播并重新启动警报
使用set
设置警报将导致该警报在设备“打zing” /空闲时不触发。尽可能使用setAndAllowWhileIdle
或setExactAndAllowWhileIdle
(我认为是API级别23中引入的)
使用实时时钟(RTC)警报时,这可能会导致意外结果,因为该应用程序可能会很好地转换为其他语言环境。已过去的实时警报比RTC警报具有更好的伸缩性