Android AlarmManager不能在晚上工作

时间:2017-05-14 12:49:37

标签: java android notifications alarmmanager

我遇到了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"/>

3 个答案:

答案 0 :(得分:0)

我认为你的代码一切正常。您可以在Android studio终端上使用此命令检查是否设置了闹钟。 adb shell dumpsys alarms >dump.txt 然后在该文件中搜索您的包名称。这将确认您的闹钟是否设置成功。

接下来您正在使用setRepeating,这意味着系统可以调整投放时间。要在确切时间发出警报,请使用setExact 这是官方android文档的摘录:

  

注意:从API 19开始,所有重复警报都不准确。如果您的应用程序需要精确的交付时间,则必须使用一次性精确警报,每次重新安排如上所述。

答案 1 :(得分:0)

来自api docs:

  

注意:从API 19开始,所有重复警报都不准确。如果你的   应用程序需要精确的交付时间,然后必须使用一次性   确切的警报,每次重新安排,如上所述。遗产   targetSdkVersion早于API 19的应用程序将   继续发出所有警报,包括重复警报,   确切地对待。

https://developer.android.com/reference/android/app/AlarmManager.html#setRepeating(int, long, long, android.app.PendingIntent)

您应该回答几个问题。

  • 这真的需要准确吗?

  • 如果用户正在睡觉,可以等到他们叫醒手机吗?

由于忽略了手机的状态,因此通常不鼓励使用确切的警报。例如,当用户甚至不看他们的手机时,对用户来说同步它并不“好”。

如果您要连接服务器并更新某些数据,我建议使用“推送”方法而不是“拉”方法。

答案 2 :(得分:0)

他们系统只在向AlarmReceiver发送警报通知时持有唤醒锁。除非设备保持清醒有其他原因,否则在意图交付给活动之前,它将完全恢复睡眠状态。

查看WakefulBroadcastReceiver