我遇到了Android AlarmManager的问题。我想每天00:01 AM显示通知。当我在白天上午11:30测试通知时,通知会显示出来。但是当我在00:01 AM进行测试时,没有任何显示。
我认为这与我的手机在00:01 AM没有活动几个小时后睡着有关,但我不确定。有人有解决方案吗?提前谢谢。
MainActivity:
Intent alarmIntent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager manager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 1);
Calendar now = Calendar.getInstance();
now.setTimeInMillis(System.currentTimeMillis());
if (calendar.before(now)) {
calendar.add(Calendar.DAY_OF_MONTH, 1);
manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pendingIntent);
} else {
manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pendingIntent);
}
AlarmReceiver:
private static int NOTIFICATION_ID;
private NotificationManager notificationManager;
private PendingIntent pendingIntent;
Intent mIntent;
@Override
public void onReceive(Context context, Intent intent) {
NOTIFICATION_ID = random.nextInt(9999 - 1000) + 1000;
notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
mIntent = new Intent(context, BirthdayActivity.class);
pendingIntent = PendingIntent.getActivity(context, NOTIFICATION_ID, mIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setContentTitle("Name");
builder.setContentIntent(pendingIntent);
notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_ID, builder.build());
}
清单:
<receiver android:name=".utils.AlarmReceiver" android:enabled="true">
</receiver>
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
答案 0 :(得分:0)
我认为你的代码一切正常。您可以在Android studio终端上使用此命令检查是否设置了闹钟。
adb shell dumpsys alarms >dump.txt
然后在该文件中搜索您的包名称。这将确认您的闹钟是否设置成功。
接下来您正在使用setRepeating
,这意味着系统可以调整投放时间。要在确切时间发出警报,请使用setExact
这是官方android文档的摘录:
注意:从API 19开始,所有重复警报都不准确。如果您的应用程序需要精确的交付时间,则必须使用一次性精确警报,每次重新安排如上所述。
答案 1 :(得分:0)
来自api docs:
注意:从API 19开始,所有重复警报都不准确。如果你的 应用程序需要精确的交付时间,然后必须使用一次性 确切的警报,每次重新安排,如上所述。遗产 targetSdkVersion早于API 19的应用程序将 继续发出所有警报,包括重复警报, 确切地对待。
您应该回答几个问题。
这真的需要准确吗?
如果用户正在睡觉,可以等到他们叫醒手机吗?
由于忽略了手机的状态,因此通常不鼓励使用确切的警报。例如,当用户甚至不看他们的手机时,对用户来说同步它并不“好”。
如果您要连接服务器并更新某些数据,我建议使用“推送”方法而不是“拉”方法。
答案 2 :(得分:0)
他们系统只在向AlarmReceiver
发送警报通知时持有唤醒锁。除非设备保持清醒有其他原因,否则在意图交付给活动之前,它将完全恢复睡眠状态。
查看WakefulBroadcastReceiver