Android设置Exact Repeating Alarms WorkAround

时间:2014-12-15 05:51:11

标签: android android-intent android-pendingintent

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

  1. 当我从时间选择器中选择时间时,我会将确切的警报设置为给定的时间并启动一个待处理的意图,该意图在其时间调用MyBroadCastReceiver.java(扩展BroadcastReceiver)。然后,我将该意图转发给AlarmFireActivity的另一个未决意图。 (AlarmFireActivity也有贪睡,只需将pendingIntent设置为自己在5分钟后开火。)
  2. 因此,MyBroadCastReceiver组件仅接收实际警报(而不是暂停)。它的功能是: a)获取非重复待定意图取消它,然后从意图创建另一个待处理意图,然后将其设置为同时设置为第二天的毫秒数。 b)启动AlarmFireActivity并显示警报。
  3. 在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集中重复使用相同的意图到第二天。

    代码

            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

    逻辑

    如果设置闹钟的时间是在闹钟到期之后,请不要将待处理的意图转发到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正在完成第二项任务。但是,不是任务一个。它不会重复/重置新的未决意图。我猜我一定搞砸了intent / pendingIntent。我不知道哪个。请帮忙/

1 个答案:

答案 0 :(得分:0)

解决方案重新启动手机。我已经在某个地方看到过某个操作系统中有一个错误。 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的待处理意图。谢谢大家!