为了账号安全,请及时绑定邮箱和手机立即绑定

通知在不遵循 AlarmManager 的情况下工作

通知在不遵循 AlarmManager 的情况下工作

幕布斯6054654 2023-03-09 15:42:15
我创建了两个不同的每日通知。两者都将在不同的给定时间运行。第二个通知将从 API 获取一些数据,检查来自该 API 的数据是否与今天的日期匹配,并显示它。每次我打开警报时都会运行第一个通知(我已经创建了打开或关闭通知的设置),但它不会在给定的时间运行。另一个甚至不会运行 BroadcastReceiver 类,即使我已经设置了警报。这是我的代码MainActivity.javapublic static void setAlarmDaily(Context context){    Calendar calendar = Calendar.getInstance();    calendar.set(Calendar.HOUR_OF_DAY, 7);    calendar.set(Calendar.MINUTE, 0);    calendar.set(Calendar.SECOND,0);    Intent intent = new Intent(context, NotifyService.class);    intent.putExtra(EXTRA_TYPE, DAILY_REQUEST_CODE);    AlarmManager alarmManager = (AlarmManager)context.getSystemService(ALARM_SERVICE);    PendingIntent pendingIntent = PendingIntent.getBroadcast(context,100,intent,PendingIntent.FLAG_UPDATE_CURRENT);    if(alarmManager != null){        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY,pendingIntent);    }}public static void setAlarmRelease(Context context){    Intent intent = new Intent(context, NotifyService.class);    intent.putExtra(EXTRA_TYPE, LATEST_REQUEST_CODE);    AlarmManager alarmManager1 = (AlarmManager)context.getSystemService(ALARM_SERVICE);    PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context,101,intent,PendingIntent.FLAG_UPDATE_CURRENT);    Calendar calendar1 = Calendar.getInstance();    calendar1.set(Calendar.HOUR_OF_DAY, 8);    calendar1.set(Calendar.MINUTE, 0);    calendar1.set(Calendar.SECOND,0);    if(alarmManager1 != null){        alarmManager1.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar1.getTimeInMillis(), AlarmManager.INTERVAL_DAY,pendingIntent1);    }}
查看完整描述

1 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

尝试改变


alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,

     calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY,pendingIntent);


 long dateTime = calendar.getTimeInMillis();

 if (dateTime <= System.currentTimeMillis()) {

     time = dateTime + 24 * 3600 * 1000;

 } 

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

        alarmManager.setWindow(AlarmManager.RTC_WAKEUP, dateTime ,

                AlarmManager.INTERVAL_DAY, pendingIntent);

    } else {

        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, dateTime , 

                AlarmManager.INTERVAL_DAY, pendingIntent);

    }

如果您阅读了与AlarmManager相关的 Android 文档


从 API 19 (Build.VERSION_CODES.KITKAT) 开始,警报传递不准确:操作系统将转移警报以尽量减少唤醒和电池使用。有新的 API 来支持需要严格交付保证的应用程序;请参阅setWindow(int, long, long, android.app.PendingIntent)和setExact(int, long, android.app.PendingIntent)。targetSdkVersion 早于 API 19 的应用程序将继续看到以前的行为,即所有警报都在请求时准确传递。


编辑:


我建议在完成各自的任务后,在您的 broadcastReceiver 中调用您的setAlarmDaily和方法。setAlarmRelease并更改一次警报的方法。像这样:


long dateTime = calendar.getTimeInMillis();

 if (dateTime <= System.currentTimeMillis()) {

     time = dateTime + 24 * 3600 * 1000;

 } 

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

        //alarmManager.setExact(AlarmManager.RTC_WAKEUP, dateTime, pendingIntent); // not suggested

        // 15 mins of window to call the alarm and have battery optimization

        long windowMillis = 15 * 60 * 1000L;

        alarmManager.setWindow(AlarmManager.RTC_WAKEUP, dateTime ,

                windowMillis, pendingIntent);

    } else {

        alarmManager.set(AlarmManager.RTC_WAKEUP, dateTime, pendingIntent);

    }


查看完整回答
反对 回复 2023-03-09
  • 1 回答
  • 0 关注
  • 83 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信