当用户更改系统时间时 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:
- 读取数据库并识别所有通过的警报。
- 取消通过的警报
- 设置第二天的闹钟
您的代码可能如下所示:
在您的清单中:
<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
}
}
您可以找到许多关于如何使用数据库并在您的代码中实现它的教程。希望我的回答能有所帮助。
是的,它会给你广播,因为当你改变时间大于你的警报触发时间时,你的未决意图对象仍然附加到那个事件。
解决方案-在收到警报管理器的广播时验证您的条件
我正在使用 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:
- 读取数据库并识别所有通过的警报。
- 取消通过的警报
- 设置第二天的闹钟
您的代码可能如下所示:
在您的清单中:
<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
}
}
您可以找到许多关于如何使用数据库并在您的代码中实现它的教程。希望我的回答能有所帮助。
是的,它会给你广播,因为当你改变时间大于你的警报触发时间时,你的未决意图对象仍然附加到那个事件。
解决方案-在收到警报管理器的广播时验证您的条件