【问题标题】:Android set Exact Repeating Alarms WorkAroundAndroid 设置精确重复警报解决方法
【发布时间】:2014-12-15 05:51:10
【问题描述】:

我试图通过在广播中收到它的那一刻手动将闹钟设置为第二天,以精确的方式设置重复闹钟。但是,我可能会遗漏一些东西,并且不知何故它不起作用。 逻辑:

  1. 当我从时间选择器中选择时间时,我会为给定的时间设置一个准确的警报,并启动一个挂起的 Intent,它在时间到时调用 MyBroadCastReceiver.java(扩展 BroadcastReceiver)。然后,我将带有另一个待处理意图的意图转发给 AlarmFireActivity。 (AlarmFireActivity 也有 snooze,它只是将一个 pendingIntent 设置为自身,在 5 分钟后触发。)
  2. MyBroadCastReceiver 组件因此只接收实际的警报(而不是贪睡)。它的功能是: a) 获取非重复的未决意图取消它,然后从该意图创建另一个未决意图,然后将其设置为同时设置为第二天的毫秒。 b) 启动 AlarmFireActivity 并显示警报。

在 AddAlarmActivity

Intent intent = new Intent(context, MyBroadcastReceiver.class);
    intent.putExtra(DBHelper.COLUMN_ID,alarm.getId());
    AlarmManager alarmManager = (AlarmManager) context.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    if (alarmManager != null) {
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, reminder.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, reminder.getHourOfDay());
        calendar.set(Calendar.MINUTE, reminder.getMinuteOfHour());
        calendar.set(Calendar.SECOND,0);
        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                pendingIntent);
        BLog("Pending intent added at " + new SimpleDateFormat(utilFunctions.timeFormat).format(calendar.getTime()));
    }

Snippet MyBroadCastReceiver.java TaskOne

逻辑

获取 MyBroadCastReceiver 接收的意图。在新的 PendingIntent 集中重复使用相同的 Intent 设置为下一天的同一时间。

代码

        AlarmManager alarmManager = (AlarmManager) context.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
        if (alarmManager != null) {
            PendingIntent p1 = PendingIntent.getBroadcast(context, alarmCurrent.getReminderId(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
            if(p1!=null){
                alarmManager.cancel(p1);
            }
            PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, alarmCurrent.getReminderId(), intent, PendingIntent.FLAG_UPDATE_CURRENT);

            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            //for test
            calendar.add(Calendar.MINUTE,1);
            alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                    pendingIntent1);

        }

MyBroadCastReceiver.java TaskTwo

逻辑

如果设置警报的时间晚于警报到期时间,则不要将待处理的 Intent 转发到 AlarmFireActivity。 否则将其转发到 AlarmFireActivity,它会显示关闭/暂停警报的屏幕。

代码

 Calendar timeSet = alarmCurrent.getAlarmReminderSetTime();
 Calendar alarmTime = Calendar.getInstance();
        if(timeSet!=null && alarmTime.getTimeInMillis() > timeSet.getTimeInMillis()){
            Intent intent1 = new Intent(context, AlarmFireActivity.class);
            intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent1.putExtra(DBHelper.COLUMN_ID,id);
            String ext = extras.getString(DBHelper.TASK_TITLE);
            if(ext!=null){
                intent1.putExtra(DBHelper.TASK_TITLE,ext);
            }
            context.startActivity(intent1);
        }else{

        }

BroadCastReceiver 正在完成第二个任务。但是,不是任务一。它不会重复/重置新的待处理意图。我猜我一定在某处搞砸了意图/pendingIntent。我不知道是哪个。请帮忙/

【问题讨论】:

  • 为什么不用alarmManager.setRepeating(...) 而不是每次都设置一个闹钟?
  • 是的。但是可以在这里看到developer.android.com/reference/android/app/AlarmManager.html .SetRepeating 默认情况下是 inExact ,这意味着它不会在一分钟的第二个 0 处触发。但在 40 左右。并不理想。
  • 请在此处粘贴您如何在广播接收器中创建意图。还请使用 SimpleDateFormat 注销 (BLog) 日历时间。请注意,如果您在设置后再次使用它,则不必取消它。它将自动更新。
  • @Blehi:感谢您的关注。它现在可以工作了。

标签: android android-intent android-pendingintent


【解决方案1】:

解决方法是重启手机。我在某处看到操作系统的 4.3 左右有一个错误。请求 id 为 0 的待处理意图有时可能会失败。一旦我重新启动手机,它就可以工作了。但是,有一个更标准的解决方案是:

更换

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, reminder.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, A_NUMBER_GREATER_THAN_ZERO + reminder.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT);

这样您就可以始终避免使用 0 的未决意图。谢谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多