AlarmMenager检查警报是否已触发

时间:2014-12-19 17:23:41

标签: android alarmmanager

我开发了一个闹钟。 主屏幕会列出所有警报并添加选项以将新警报添加到列表中。 我正在使用警报管理器来触发通知或打开用户屏幕。 用户打开通知屏幕和点击按钮后,返回主屏幕并列出所有警报。

所有已经触发但不会再次触发的警报都标有不同的颜色。 为了识别发出警报,我使用此代码:

How to check if AlarmManager already has an alarm set?

但此代码仅在触发警报30秒后返回false(警报未设置)警报,并在返回主屏幕时立即返回true(警报设置)。

设置闹钟我正在使用此服务:

protected static void SetBackgroudAlrm(long alarmTime, boolean toggleBtnRep,int AlrmID,Context context) {
    /** Set Alarm in Background */
    AlarmManager manager; 
    PendingIntent pIntent = null ;
        Intent alarmIntent = new Intent(context,AlarmReceiver.class);
        pIntent = PendingIntent.getBroadcast(context, AlrmID, alarmIntent, 0);          

        manager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        if (toggleBtnRep){ //repeat is on
            manager.setInexactRepeating(AlarmManager.RTC_WAKEUP,alarmTime ,7 * 24 * 60 * 60 * 1000, pIntent);
        } else { //repeat is off
            manager.set(AlarmManager.RTC_WAKEUP,alarmTime, pIntent);
        }   
        Toast.makeText(MainActivity.getContext(), "Alarm Set ", Toast.LENGTH_SHORT).show();
        //enable automatically resetting alarms when device reboots
       ComponentName receiver = new ComponentName(context, BootReceiver.class);

        PackageManager pm = context.getPackageManager();

        pm.setComponentEnabledSetting(receiver,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
    }

为了检查是否设置了警报,我使用以下代码:

    public static boolean ChkActiveAtrm(int pos){
boolean Rtn = false;
    int  AlrmID[]=ListViewAdapter.GetAlrmSelectID(MainActivity.AlrmIDStr.get(pos),pos);

    for (int i=0;i<AlrmID.length;i++){
        boolean alarmUp = (PendingIntent.getBroadcast(MainActivity.getContext(), AlrmID[i],
                new Intent(MainActivity.getContext(),AlarmReceiver.class),
                PendingIntent.FLAG_NO_CREATE) != null);
        if (alarmUp) {Rtn=true;}
    } //end for

返回Rtn; }

有没有人发现这种现象? 我可以立即获得警报设置/未设置的指示? 谢谢

1 个答案:

答案 0 :(得分:0)

首先,不要仅依靠AlarmManager来保存和管理警报。有许多情况会清除或延迟警报等。

有一个SQLite表等来正确跟踪警报,以及创建的,计划的和触发的时间戳。

 ______________________________________________________________________
| id | name | repeating |   time   | interval | set_at  | triggered_at |
 ______________________________________________________________________
| 0  | abc  |     1     |  2394000 |  36000   | 2003900 | 1800094      |
 ______________________________________________________________________

然后:

  1. 实施启动意图接收器以读取此表并为每条记录安排警报。

  2. 更新闹钟设置后,请在数据库中更新并重新安排该闹钟。

  3. 触发警报时,更新相应数据库记录中的时间戳。