Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当用户更改系统时间时,AlarmManager报警是否启动?_Android_Alarmmanager - Fatal编程技术网

Android 当用户更改系统时间时,AlarmManager报警是否启动?

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

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

但是,如果我将警报设置为晚上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);

其中一个选项是将所有设置的报警存储在数据库中,然后创建一个广播接收器,该接收器将侦听
操作\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+“已取消”);}