Android 安卓:一次性警报反复触发
我使用的应用程序用户可以存储事件并将其设置为“重复时间” (例如,每周一我都有一次足球训练,所以我把这个活动放到应用程序中,它会提醒我每周一都有训练——是的,类似于提醒) 事件类仅包含标题、开始时间、重复时间和请求代码(报警的唯一编号…) 我决定使用AlarmManager来安排警报,所以当警报触发时,它只应该做一件事——检查事件是否应该重复——如果不只是从数据库中删除事件,如果是,则创建一个新事件,存储到数据库并为该事件设置新警报 一切“正常”,我的意思是数据库的删除或存储也设置了新警报,但问题是,当警报第一次触发时,它无法停止,第一个警报创建新警报,新警报是火灾,它创建另一个警报,该警报触发并创建另一个警报,以此类推。。。就像在一个循环中 那么问题出在哪里呢?在BroadcastReceiver中创建另一个警报不是一个好做法?还是我设置闹钟的方式有问题?我只想设置一个只触发一次的不重复警报,做一件事,它就会被完成。我几乎在任何地方都试图找到解决方案,但未能找到:/ 这是我的闹钟接收器Android 安卓:一次性警报反复触发,android,alarmmanager,alarm,Android,Alarmmanager,Alarm,我使用的应用程序用户可以存储事件并将其设置为“重复时间” (例如,每周一我都有一次足球训练,所以我把这个活动放到应用程序中,它会提醒我每周一都有训练——是的,类似于提醒) 事件类仅包含标题、开始时间、重复时间和请求代码(报警的唯一编号…) 我决定使用AlarmManager来安排警报,所以当警报触发时,它只应该做一件事——检查事件是否应该重复——如果不只是从数据库中删除事件,如果是,则创建一个新事件,存储到数据库并为该事件设置新警报 一切“正常”,我的意思是数据库的删除或存储也设置了新警报,但问
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);
集合,再集合?,集合,再集合?