我目前仍然坚持这个问题,如果在for循环中创建一个新的意图是好还是坏。我有以下情况:
1
public static void reactivateReminders(Schedule schedule) {
ArrayList<Lecture> allLectures = schedule.getAllLectures();
for(Lecture lecture : allLectures) {
...
// Set up various things for the reminder
...
Intent intent = new Intent(getApplicationContext(), ReminderReceiver.class);
String at = getResources().getString(R.string.at);
String with = getResources().getString(R.string.with);
String beginH = ScheduleHelper.formatNumber(changedBeginH);
String beginM = ScheduleHelper.formatNumber(changedBeginM);
String room = lecture.getRoom();
intent.putExtra("contentText", at + " " + beginH + ":" + beginM + " in " + room + " " + with + " " + lecture.getLecturer());
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), lecture.getAlarmId(), intent, 0);//PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
if(lecture.getBeginH() != beginH || lecture.getBeginM() != beginM)
alarm.cancel(pendingIntent);
alarm.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis() + offset, 1000 * 60 * 60 * 24 * 7, pendingIntent);
}
}
2
public static void reactivateReminders(Schedule schedule) {
ArrayList<Lecture> allLectures = schedule.getAllLectures();
Intent intent = new Intent(getApplicationContext(), ReminderReceiver.class);
for(Lecture lecture : allLectures) {
...
// Set up various things for the reminder
...
String at = getResources().getString(R.string.at);
String with = getResources().getString(R.string.with);
String beginH = ScheduleHelper.formatNumber(changedBeginH);
String beginM = ScheduleHelper.formatNumber(changedBeginM);
String room = lecture.getRoom();
intent.putExtra("contentText", at + " " + beginH + ":" + beginM + " in " + room + " " + with + " " + lecture.getLecturer());
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), lecture.getAlarmId(), intent, 0);//PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
if(lecture.getBeginH() != beginH || lecture.getBeginM() != beginM)
alarm.cancel(pendingIntent);
alarm.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis() + offset, 1000 * 60 * 60 * 24 * 7, pendingIntent);
}
}
哪个选项更好?我不太熟悉Java,所以我不知道Java如何处理任何一个。也许并没有什么不同,但因为我正在用C ++编程,所以在循环中创建新对象让我很担心。
感谢您提前提供任何帮助。
编辑:结论:
正如Alex Shutov所提到的,最好不要立即设置所有提醒。用户可能只需要下一个即将到来的用户。
要实现这一点,您应该在应用程序中的某个位置设置最早的提醒,并将其他提醒(或者您使用的数据)存储在应用程序外部的某些位置(XML,SQL,...),以便在最早的提醒出发后,您的服务可以读取文件以加载下一个。
通过这样做,您不会给系统带来用户甚至不需要的提醒。我会尝试在某个时候实现这个想法,但现在我将使用我的方法。
关于我的代码:
对于我发布的代码,更好的方法是在循环外创建新的intent。由于我输入的额外密钥具有相同的密钥,因此每次都会覆盖,并且您不必创建新的意图。其他变量,如我的“at”和“with”,它们是常量,也可以放在循环之外。可以删除变量“beginH,beginM,room”,您可以直接在putExtra参数中调用函数。您还可以将PendingIntent和AlarmManager行放在循环外部。
我会发布代码,但我认为我的帖子太大了。 感谢您的快速帮助:)
答案 0 :(得分:3)
这是一个坏主意,因为你用不必要的任务重载系统,你应该在IntentService计划下一个事件中安排最近的事件