Android 当用户更改系统时间时,AlarmManager报警是否启动?
我正在使用AlarmManager类设置报警,它工作正常 但是,如果我将警报设置为晚上9点,当前时间为晚上8点,并且我将系统时间更改为晚上10点Android 当用户更改系统时间时,AlarmManager报警是否启动?,android,alarmmanager,Android,Alarmmanager,我正在使用AlarmManager类设置报警,它工作正常 但是,如果我将警报设置为晚上9点,当前时间为晚上8点,并且我将系统时间更改为晚上10点 然后报警9点报警自动启动。所以要解决这个问题 我搜索了这么多,但没有找到任何好的答案 请帮忙 这是我的警报设置代码 final int id = (int) System.currentTimeMillis(); Intent intent = new Intent(this, AlarmReceiver.class); int
然后报警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);
其中一个选项是将所有设置的报警存储在数据库中,然后创建一个广播接收器,该接收器将侦听
操作\u时间\u更改
操作。当用户更改时间时,它将被触发。然后创建一个负责重置报警的IntentService
。在此服务类别中:
<uses-permission android:name="android.permission.ACTION_TIME_CHANGE"/>
创建“RestartalMSService”类,其中:
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);
}
}
}
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
}
}
您可以找到许多关于如何使用数据库并在代码中实现它的教程。希望我的回答能有所帮助 其中一个选项是将所有设置的报警存储在数据库中,然后创建一个广播接收器,该接收器将侦听
操作\u时间\u更改
操作。当用户更改时间时,它将被触发。然后创建一个负责重置报警的IntentService
。在此服务类别中:
<uses-permission android:name="android.permission.ACTION_TIME_CHANGE"/>
创建“RestartalMSService”类,其中:
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);
}
}
}
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
}
}
您可以找到许多关于如何使用数据库并在代码中实现它的教程。希望我的回答能有所帮助 是的,它将为您提供广播,因为当您更改大于报警触发时间的时间时,挂起的意图对象仍附加到该事件
解决方案-当您从alarm manager接收广播时,验证您的条件是,它将为您提供广播,因为当您更改大于报警触发时间的时间时,您的挂起意图对象仍连接到该事件
解决方案-在接收来自报警管理器的广播时验证您的状况这不是物理问题您想解决什么问题?没问题。所有之前需要调用的报警都会立即调用。指定当我更改系统时间大于报警时间,然后更改报警开始时的问题Ringing@HappyRahal当您更改时间时,您希望发生什么情况?如果我将闹钟设置为晚上7点,并将系统时间更改为晚上10点,则晚上7点的闹钟将在晚上10点立即开始响起这是不可能的。您希望解决什么问题?没问题。所有之前需要调用的报警都会立即调用。指定当我更改系统时间大于报警时间,然后更改报警开始时的问题Ringing@HappyRahal当您更改时间时,您希望发生什么情况?如果我将报警设置为晚上7点,并将系统时间更改为晚上10点,则晚上7点的报警将在晚上10点立即开始响起是的,我正在将报警详细信息存储在自定义类型的ArrayList中,然后将此arraylist存储在SharedReference中,然后在服务内部读取它并确定需要重置哪些警报。使用服务执行此类操作是一种常见做法。广播接收机用于做少量的工作。建议将任何其他任务留给服务部门处理。此外<代码>国际服务> /代码>将在后台并行运行,当作业完成后完成它自己,因此不必担心它的生命周期。@ HappyRahal然后考虑接受和投票。我的应答服务工作正常,但是警报仍然在运行,这是我取消警报的代码。
code
public void cancelAlarm(Context c,int reqCode){AlarmManager AlarmManager=(AlarmManager)c.getSystemService(Context.ALARM_SERVICE);Intent Intent=new Intent(c,AlarmReceiver.class);pendingent sender=pendingent.getBroadcast(c,reqCode,Intent,0);alarmManager.cancel(sender);Log.i(“Alarm”,reqCode+“Cancelled”);}是的,我将报警详细信息存储在自定义类型的ArrayList中,然后将此ArrayList存储在SharedReference中,然后在服务内部读取它并确定需要重置哪些报警。使用服务执行此类操作是一种常见做法。广播接收机用于做少量的工作。建议将任何其他任务留给服务部门处理。此外<代码>国际服务> /代码>将在后台并行运行,当作业完成后完成它自己,因此不必担心它的生命周期。@ HappyRahal然后考虑接受和投票。我的应答服务工作正常,但是警报仍然在运行,这是我取消警报的代码。code
public void cancelAlarm(Context c,int reqCode){AlarmManager AlarmManager=(AlarmManager)c.getSystemService(Context.ALARM_SERVICE);Intent Intent=new Intent(c,AlarmReceiver.class);pendingent sender=pendingent.getBroadcast(c,reqCode,Intent,0);alarmManager.cancel(发送方);Log.i(“报警”,reqCode+“已取消”);}