Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.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 安卓:一次性警报反复触发_Android_Alarmmanager_Alarm - Fatal编程技术网

Android 安卓:一次性警报反复触发

Android 安卓:一次性警报反复触发,android,alarmmanager,alarm,Android,Alarmmanager,Alarm,我使用的应用程序用户可以存储事件并将其设置为“重复时间” (例如,每周一我都有一次足球训练,所以我把这个活动放到应用程序中,它会提醒我每周一都有训练——是的,类似于提醒) 事件类仅包含标题、开始时间、重复时间和请求代码(报警的唯一编号…) 我决定使用AlarmManager来安排警报,所以当警报触发时,它只应该做一件事——检查事件是否应该重复——如果不只是从数据库中删除事件,如果是,则创建一个新事件,存储到数据库并为该事件设置新警报 一切“正常”,我的意思是数据库的删除或存储也设置了新警报,但问

我使用的应用程序用户可以存储事件并将其设置为“重复时间” (例如,每周一我都有一次足球训练,所以我把这个活动放到应用程序中,它会提醒我每周一都有训练——是的,类似于提醒)

事件类仅包含标题、开始时间、重复时间和请求代码(报警的唯一编号…)

我决定使用AlarmManager来安排警报,所以当警报触发时,它只应该做一件事——检查事件是否应该重复——如果不只是从数据库中删除事件,如果是,则创建一个新事件,存储到数据库并为该事件设置新警报

一切“正常”,我的意思是数据库的删除或存储也设置了新警报,但问题是,当警报第一次触发时,它无法停止,第一个警报创建新警报,新警报是火灾,它创建另一个警报,该警报触发并创建另一个警报,以此类推。。。就像在一个循环中

那么问题出在哪里呢?在BroadcastReceiver中创建另一个警报不是一个好做法?还是我设置闹钟的方式有问题?我只想设置一个只触发一次的不重复警报,做一件事,它就会被完成。我几乎在任何地方都试图找到解决方案,但未能找到:/

这是我的闹钟接收器

    public class AlarmReceiver extends BroadcastReceiver {

    private static final String ALARM_RECIVER_TAG = "AlarmReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent == null && intent.getStringExtra("starttime") == null) {
            Log.i(ALARM_RECIVER_TAG, "Alarm not recieve properly");
        } else {
            handleEvents(context,intent.getLongExtra("starttime",0));
            Log.i(ALARM_RECIVER_TAG, "Alarm recieve");
        }
    }

    public void handleEvents(Context context, Long startTime) {
        DBHelper dbHelper = DBHelper.getInstance(context);
        Event event = dbHelper.getEvent(new Timestamp(startTime));
        if (event == null) return; //should not happenned

        if (event.getRepeatTime().equalsIgnoreCase("no repeat")) {
            dbHelper.deleteEvent(context,event.getStartTime().getTime());
            return;
        }

        Event newEvent = new Event();
        newEvent.setEventTitle(event.getEventTitle());
        newEvent.setRepeatTime(event.getRepeatTime());
        newEvent.setStartTime(CommonUtils.getDateByRepeat(event.getRepeatTime(),event.getStartTime()));

        dbHelper.deleteEvent(context,event.getStartTime().getTime());
        try {
            dbHelper.putInformation(dbHelper,newEvent);
            Log.i(ALARM_RECIVER_TAG,"everything ok");
        } catch (Exception e) {
            Log.i(ALARM_RECIVER_TAG,"something is bad");
            e.printStackTrace();
        }

        if (newEvent.getStartTime() != null) {
            setRecurringAlarm(context,newEvent);
        }

    }

    public void setRecurringAlarm(Context context, Event event) {
        // set time when alarm should fire
        Calendar updateTime = Calendar.getInstance();
        updateTime.set(Calendar.HOUR_OF_DAY, event.getSendingTime().getHours());
        updateTime.set(Calendar.MINUTE, event.getSendingTime().getMinutes());
        updateTime.set(Calendar.SECOND, event.getSendingTime().getSeconds());

        Intent intent = new Intent(context, AlarmReceiver.class);
        intent.putExtra("starttime",event.getStartTime().getTime());
        PendingIntent alarmIntent = PendingIntent.getBroadcast(context, event.getRequestCode(), intent, PendingIntent.FLAG_ONE_SHOT);
        AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
      alarms.set(AlarmManager.RTC_WAKEUP,updateTime.getTimeInMillis(),alarmIntent);
    }
}
下面是我如何调用设置活动警报的方法

 AlarmReceiver alarmReceiver = new AlarmReceiver();
    alarmReceiver.setRecurringAlarm(context, event);

集合,再集合?,集合,再集合?