当用户更改系统时间时 AlarmManager 警报启动?

AlarmManager alarm start when system time is changed by user?

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

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

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

这是我的闹钟设置代码

    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);

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

  1. 读取数据库并识别所有通过的警报。
  2. 取消通过的警报
  3. 设置第二天的闹钟

您的代码可能如下所示:

在您的清单中:

<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"/>

创建class"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" class其中:

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
    }
}

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

是的,它会给你广播,因为当你改变时间大于你的警报触发时间时,你的未决意图对象仍然附加到那个事件。

解决方案-在收到警报管理器的广播时验证您的条件