无法设置开机重复闹钟
Unable to set repeat alarm on boot time
我在 10:30 下午收到通知。但是当我的设备在 10:30 下午关闭,然后在我在 11:00 下午打开我的设备后,我没有收到待处理通知。所以我不明白问题出在哪里。任何帮助将不胜感激。
这是我在 activity 创建时的代码。
Intent alarmIntent = new Intent(CH_Dashboard.this, TimeAlarmEvening.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(CH_Dashboard.this, 0, alarmIntent, 0);
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Calendar firingCal = Calendar.getInstance();
Calendar currentCal = Calendar.getInstance();
firingCal.set(Calendar.HOUR, 10);
firingCal.set(Calendar.MINUTE, 30);
firingCal.set(Calendar.SECOND, 0);
firingCal.set(Calendar.AM_PM,Calendar.PM);
long intendedTime = firingCal.getTimeInMillis();
long currentTime = currentCal.getTimeInMillis();
if(intendedTime >= currentTime)
{
manager.setRepeating(AlarmManager.RTC,
intendedTime, AlarmManager.INTERVAL_DAY,
pendingIntent);
}
else
{
firingCal.add(Calendar.DAY_OF_MONTH, 1);
intendedTime = firingCal.getTimeInMillis();
manager.setRepeating(AlarmManager.RTC,
intendedTime, AlarmManager.INTERVAL_DAY,
pendingIntent);
}
我的接收器代码在这里,当设备打开时成功收到通知。
Intent notificationIntent = new Intent(context, CH_Dashboard.class);
notificationIntent.putExtra("fromNotification","notify");
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(CH_Dashboard.class);
stackBuilder.addNextIntent(notificationIntent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setAutoCancel(true);
Notification notification = builder.setContentTitle("Demo App Notification")
.setContentText("New Notification From Demo App..")
.setTicker("New Message Alert!")
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pendingIntent).build();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notification);
这是我的引导接收器代码。
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
{
Intent alarmIntent = new Intent(context, TimeAlarmEvening.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Calendar firingCal = Calendar.getInstance();
Calendar currentCal = Calendar.getInstance();
firingCal.set(Calendar.HOUR, 10);
firingCal.set(Calendar.MINUTE, 30);
firingCal.set(Calendar.SECOND, 0);
firingCal.set(Calendar.AM_PM,Calendar.PM);
long intendedTime = firingCal.getTimeInMillis();
long currentTime = currentCal.getTimeInMillis();
if(intendedTime >= currentTime)
{
manager.setInexactRepeating(AlarmManager.RTC,
intendedTime, AlarmManager.INTERVAL_DAY,
pendingIntent);
}
else
{
firingCal.add(Calendar.DAY_OF_MONTH, 1);
intendedTime = firingCal.getTimeInMillis();
manager.setInexactRepeating(AlarmManager.RTC,
intendedTime, AlarmManager.INTERVAL_DAY,
pendingIntent);
}
}
最后在清单中我声明了接收方。
<receiver
android:name=".model.AutoStart"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<receiver android:name=".TimeAlarmEvening">
<intent-filter>
<action android:name="android.media.action.DISPLAY_NOTIFICATION_EVENING" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
我不会为您写下整个代码。但我可以告诉你在哪里可以应用你的逻辑。
-> 首先,找到一种方法来跟踪自己,错过了什么,例如通过跟踪数据库中的事件状态。
-> 然后,设置一个 BOOT_COMPLETED
BroadcastReceiver
来查找 phone 何时重启。在那里,安排任何仍在未来的警报,并决定如何处理过去发生但错过的警报(例如,发出通知指出错过的事件)。
-- 一种方法是监听 phone 关闭事件:
<action android:name="android.intent.action.ACTION_SHUTDOWN" />
并在设备关机前,保存关机时间。
然后监听设备启动:
<action android:name="android.intent.action.BOOT_COMPLETED" />
并编写您自己的逻辑来确定在停机期间触发哪些警报,并立即使用 AlarmManager 触发这些警报。
那天我解决了但是忘记在这里回答了。我对清单文件进行了一些更改。只需删除意向过滤器和作品中的默认行类别。
<receiver
android:name=".model.AutoStart"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver android:name=".TimeAlarmEvening">
<intent-filter>
<action android:name="android.media.action.DISPLAY_NOTIFICATION_EVENING" />
</intent-filter>
</receiver>
我在 10:30 下午收到通知。但是当我的设备在 10:30 下午关闭,然后在我在 11:00 下午打开我的设备后,我没有收到待处理通知。所以我不明白问题出在哪里。任何帮助将不胜感激。
这是我在 activity 创建时的代码。
Intent alarmIntent = new Intent(CH_Dashboard.this, TimeAlarmEvening.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(CH_Dashboard.this, 0, alarmIntent, 0);
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Calendar firingCal = Calendar.getInstance();
Calendar currentCal = Calendar.getInstance();
firingCal.set(Calendar.HOUR, 10);
firingCal.set(Calendar.MINUTE, 30);
firingCal.set(Calendar.SECOND, 0);
firingCal.set(Calendar.AM_PM,Calendar.PM);
long intendedTime = firingCal.getTimeInMillis();
long currentTime = currentCal.getTimeInMillis();
if(intendedTime >= currentTime)
{
manager.setRepeating(AlarmManager.RTC,
intendedTime, AlarmManager.INTERVAL_DAY,
pendingIntent);
}
else
{
firingCal.add(Calendar.DAY_OF_MONTH, 1);
intendedTime = firingCal.getTimeInMillis();
manager.setRepeating(AlarmManager.RTC,
intendedTime, AlarmManager.INTERVAL_DAY,
pendingIntent);
}
我的接收器代码在这里,当设备打开时成功收到通知。
Intent notificationIntent = new Intent(context, CH_Dashboard.class);
notificationIntent.putExtra("fromNotification","notify");
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(CH_Dashboard.class);
stackBuilder.addNextIntent(notificationIntent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setAutoCancel(true);
Notification notification = builder.setContentTitle("Demo App Notification")
.setContentText("New Notification From Demo App..")
.setTicker("New Message Alert!")
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pendingIntent).build();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notification);
这是我的引导接收器代码。
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
{
Intent alarmIntent = new Intent(context, TimeAlarmEvening.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Calendar firingCal = Calendar.getInstance();
Calendar currentCal = Calendar.getInstance();
firingCal.set(Calendar.HOUR, 10);
firingCal.set(Calendar.MINUTE, 30);
firingCal.set(Calendar.SECOND, 0);
firingCal.set(Calendar.AM_PM,Calendar.PM);
long intendedTime = firingCal.getTimeInMillis();
long currentTime = currentCal.getTimeInMillis();
if(intendedTime >= currentTime)
{
manager.setInexactRepeating(AlarmManager.RTC,
intendedTime, AlarmManager.INTERVAL_DAY,
pendingIntent);
}
else
{
firingCal.add(Calendar.DAY_OF_MONTH, 1);
intendedTime = firingCal.getTimeInMillis();
manager.setInexactRepeating(AlarmManager.RTC,
intendedTime, AlarmManager.INTERVAL_DAY,
pendingIntent);
}
}
最后在清单中我声明了接收方。
<receiver
android:name=".model.AutoStart"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<receiver android:name=".TimeAlarmEvening">
<intent-filter>
<action android:name="android.media.action.DISPLAY_NOTIFICATION_EVENING" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
我不会为您写下整个代码。但我可以告诉你在哪里可以应用你的逻辑。
-> 首先,找到一种方法来跟踪自己,错过了什么,例如通过跟踪数据库中的事件状态。
-> 然后,设置一个 BOOT_COMPLETED
BroadcastReceiver
来查找 phone 何时重启。在那里,安排任何仍在未来的警报,并决定如何处理过去发生但错过的警报(例如,发出通知指出错过的事件)。
-- 一种方法是监听 phone 关闭事件:
<action android:name="android.intent.action.ACTION_SHUTDOWN" />
并在设备关机前,保存关机时间。
然后监听设备启动:
<action android:name="android.intent.action.BOOT_COMPLETED" />
并编写您自己的逻辑来确定在停机期间触发哪些警报,并立即使用 AlarmManager 触发这些警报。
那天我解决了但是忘记在这里回答了。我对清单文件进行了一些更改。只需删除意向过滤器和作品中的默认行类别。
<receiver
android:name=".model.AutoStart"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver android:name=".TimeAlarmEvening">
<intent-filter>
<action android:name="android.media.action.DISPLAY_NOTIFICATION_EVENING" />
</intent-filter>
</receiver>