【发布时间】:2016-06-09 12:29:05
【问题描述】:
我正在使用以下代码取消所有警报并重置它们:
for (int i = 0; i < mArrayList.size(); i++) {
Intent receiverIntent = new Intent(mContext, AlarmReceiver.class);
int _id = (int) mArrayList.get(i).getDateMillis(); //(int) System.currentTimeMillis();
PendingIntent sender = PendingIntent.getBroadcast(mContext, _id, receiverIntent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(mContext.ALARM_SERVICE);
alarmManager.cancel(sender);
setAlarm(mContext, receiverIntent, mArrayList.get(i).getType(), _id, sender, alarmManager);
}
public static void setAlarm(Context context, Intent receiverIntent, String typ, long timeMillis, PendingIntent pendingIntent, AlarmManager
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeMillis);
long sdl = calendar.getTimeInMillis();
String notificationTitle = "My Title";
String notificationText = "My Text";
receiverIntent.putExtra("notificationTitle", notificationTitle);
receiverIntent.putExtra("notificationText", notificationText);
receiverIntent.putExtra("notificationDateTime", sdl);
alarmManager.set(AlarmManager.RTC_WAKEUP, sdl, pendingIntent);
}
问题是当我第一次拨打CancelAllAlarms() 然后设置我的警报时,新警报创建得很好,但旧警报没有被删除。
因此,如果我第一次执行 adb shell dumpsys alarm > D:\test.txt 时有大约 200 个条目,下一次运行应用程序时我有大约 400 个,然后是 600 个等等......
编辑
我更改了很多代码,因为我现在将生成的 ID 存储在工作正常的数据库中。所以我的代码发生了重大变化:
Intent receiverIntent = new Intent(mContext, AlarmReceiver.class); AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(mContext.ALARM_SERVICE);
String[] alarms = getAllAlarmsFromDB(databaseHAlarms, databaseHAlarms.tableName_alarms);
for (int i = 0; i < alarms.length; i++) {
//alarms[i] now holds the ID set before (see codee below)
PendingIntent sender = PendingIntent.getBroadcast(mContext, Integer.parseInt(alarms[i]), receiverIntent, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.cancel(sender);
}
for (int i = 0; i < mArrayList.size(); i++) {
long timeMillis = mArrayList.get(i).getDateMillis();
int _id = Integer.parseInt(String.valueOf(mArrayList.get(i).getDateMillis()).substring(0, 8));
PendingIntent sender = PendingIntent.getBroadcast(mContext, _id, receiverIntent, PendingIntent.FLAG_CANCEL_CURRENT);
insertAlarmIntoMySQL(databaseHAlarms, getMD5(timeMillis + ""), String.valueOf(mArrayList.get(i).getDateMillis()).substring(0, 8));
alarmManager.set(AlarmManager.RTC_WAKEUP, sdl, sender);
}
【问题讨论】:
-
除了 user8 的回答之外,最好的方法是将 alarmManager 和 'PendingIntent' 设为全局并将它们用于启动和取消。如果您开发 target >=Marshmallow,请确保您已阅读此内容:developer.android.com/training/monitoring-device-state/…
-
您将_id 设置为 System.timeInMillis() 的目标是什么?...这很不寻常....
-
关于 Doze 的非常有趣的读物,谢谢!我正在使用系统millis,因为我在很多文章/警报示例代码中看到了这一点。您会建议改用什么?
-
是哪些教程制作的?我猜这会把你引向错误的方向,或者这些 tuts 有其他目标。设置唯一
Id的简单步骤是例如来自arrayList item的count。您只需将方法setAlarm调整为setAlarm(Context context, Intent receiverIntent, String type, long timeMillis, int id)并使用setAlarm(mContext, receiverIntent, mArrayList.get(i).getType(), mArrayList.get(i).getDateMillis(),i);将其传递到循环中 -
好的,将您的 PendingIntent 更改为
FLAG_UPDATE_CURRENT(在 set 和 cancel() 方法上)并确保使用相同的上下文。还要确保 id 是正确的,因为我不知道代码,这对我来说似乎有点混乱。如果您确定一切设置正确,它应该可以工作。
标签: android android-pendingintent android-alarms