当用户更改系统时间时,AlarmManager报警开始?

时间:2016-09-16 09:06:13

标签: android alarmmanager

我正在使用 AlarmManager 类设置警报,它正常工作。

但如果我设置闹钟如下午9点,当前时间是晚上8点,我将系统时间改为晚上10点 然后报警9pm报警自动开始。所以要解决这个问题

我搜索了这么多,但没有找到任何好的答案 请帮忙

这是我的警报设置代码

    final int id = (int) System.currentTimeMillis();
    Intent intent = new Intent(this, AlarmReceiver.class);
    intent.putExtra("requestCode", id);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 2*60*1000, pendingIntent);

2 个答案:

答案 0 :(得分:3)

其中一个选项是将所有设置的警报存储在数据库中,然后创建一个将侦听ACTION_TIME_CHANGE操作的BroadcastReceiver。当用户更改时间时,它将被触发。然后创建一个IntentService,负责重置警报。在此服务类中:

  1. 读取数据库并识别所有已通过的警报。
  2. 取消已通过警报
  3. 设置第二天的闹钟
  4. 您的代码可能如下所示:

    在你的宣言中:

    <uses-permission android:name="android.permission.ACTION_TIME_CHANGE"/>
    

    及以下活动:

     <receiver android:name=".TimeChangedReceiver" android:enabled="true">
         <intent-filter>
             <action android:name="android.intent.action.TIME_SET" />
         </intent-filter>
     </receiver>
    
     <service android:name=".RestartAlarmsService"/>
    

    创建类“TimeChangedReceiver”,其中包含:

    public class TimeChangedReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            if("android.intent.action.TIME_SET".equals(intent.getAction())) {
                Intent i = new Intent(context, RestartAlarmsService.class);
                ComponentName service = context.startService(i);
            }
    
        }
    }
    

    创建“RestartAlarmsService”类,其中包含:

    public class RestartAlarmsService extends IntentService {
    
        public RestartAlarmsService() {
            super("RestartAlarmsService");
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
    
            // read db here
            // then cancel passed alarms
            // reset them to next day
        }
    }
    

    您可以找到许多有关如何使用数据库并在代码中实现它的教程。希望我的回答有点帮助。

答案 1 :(得分:0)

是的,它将为您提供广播,因为当您更改的时间大于您的警报发射时间时,您的待处理意图对象仍然附加到该事件。

解决方案 - 在您从警报管理器接收广播时验证您的状况