AlarmManager 不触发
AlarmManager doesn't fire
我的笔记应用程序应该记住我的用户,并在用户设置的特定日期和时间在他们的笔记中发出通知。我的问题是我没有在设定的时间收到通知。
这是我的alarmManager.class(我在这里创建我的闹钟)
public class alarmManager {
public static void createAlarm(long timeInMillis, int requestCode, Intent i) {
PendingIntent pi = PendingIntent.getService(MainActivity.context, requestCode, i, PendingIntent.FLAG_UPDATE_CURRENT);
getAlarmManager().set(AlarmManager.RTC_WAKEUP, timeInMillis, pi);
}
public static void deleteAlarm(Intent i, int requestCode) {
if (doesPendingIntentExist(MainActivity.context, i, requestCode)) {
PendingIntent pi = PendingIntent.getService(MainActivity.context, requestCode, i, PendingIntent.FLAG_NO_CREATE);
pi.cancel();
getAlarmManager().cancel(pi);
}
}
private static AlarmManager getAlarmManager() {
return (AlarmManager) MainActivity.context.getSystemService(Context.ALARM_SERVICE);
}
private static boolean doesPendingIntentExist(Context context, Intent i, int requestCode) {
PendingIntent pi = PendingIntent.getService(context, requestCode, i, PendingIntent.FLAG_NO_CREATE);
return pi != null;
}
}
当用户创建新笔记时,这行代码会被触发(他们将需要的所有内容发送到我的 alarmManager.class)
Intent i = new Intent(MainActivity.context, NotificationService.class);
i.putExtra(NotificationService.i_UID, id);
i.putExtra(NotificationService.i_TEXT, title);
i.putExtra(NotificationService.i_CONTENT, content);
i.putExtra(NotificationService.i_REMINDEDATE, mUserReminderDate);
i.putExtra(NotificationService.i_REPEAT, repeatAlarmSelectedOption);
alarmManager.createAlarm(mUserReminderDate.getTime(), id.hashCode(), i);
当一切正常时,NotificationService.class 应该在选定的时间被调用。 (此处应向用户显示通知)
public class NotificationService extends IntentService {
public static final String i_UID = "uuid";
public static final String i_TEXT = "title";
public static final String i_CONTENT = "content";
public static final String i_REMINDEDATE = "remindeDate";
public static final String i_REPEAT = "repeatAlarm";
private String mTodoText, mTodoContent, mTodoUUID;
private Date mTodoDate;
private int mTodoRepeat;
private Intent processIntent;
public NotificationService() {
super("NotificationService");
}
@Override
protected void onHandleIntent(Intent intent) {
this.processIntent = intent;
mTodoText = intent.getStringExtra(i_TEXT);
mTodoContent = intent.getStringExtra(i_CONTENT);
mTodoUUID = intent.getStringExtra(i_UID);
mTodoDate = (Date) intent.getSerializableExtra(i_REMINDEDATE);
mTodoRepeat = intent.getIntExtra(i_REPEAT, 0);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification.Builder(this)
.setContentTitle(mTodoText)
.setContentText(mTodoContent)
.setSmallIcon(R.drawable.app_logo_transparent_bg)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_SOUND)
.build();
manager.notify(100, notification);
}
很遗憾,它不起作用。没有错误。没有通知。没有。
我希望有人能帮助我。
在我看来问题是当你创建一个 PendingIntent
:
PendingIntent pi = PendingIntent.getService(MainActivity.context, requestCode, i, PendingIntent.FLAG_UPDATE_CURRENT);
为了绝对确定,安排一个闹钟,然后 运行 来自 adb
以下命令:
adb shell dumpsys alarm
并搜索您的 PendingIntent
。如果找到它,请再安排一个时间警报并再安排一次 运行 命令。再次查找您的未决意向并确保它是一个新意向,然后尝试搜索之前预定的意向。如果 PendingIntent
有问题,您将只能找到最新的 PendingIntent
。
解法:
由于 AlarmManger
在比较 PendingIntents
时不比较传递给它的额外数据,而是比较请求代码、数据、操作和类别,因此您需要在每次安排新警报时更改其中一个。我的建议是将 uri
从数据库传递给每个新计划的 PendingIntent
。这将使它们中的每一个都独一无二,因此旧的不会在新的计划时被取消。总而言之,在代码调用方法 setData()
中参数 i
并将 uri 作为参数传递。您可以在方法中或从调用方法的 class 中执行此操作。它可能看起来像这样:
public static void createAlarm(long timeInMillis, int requestCode, Intent i, Uri uri) {
i.setData(uri)
PendingIntent pi = PendingIntent.getService(MainActivity.context, requestCode, i, PendingIntent.FLAG_UPDATE_CURRENT);
getAlarmManager().set(AlarmManager.RTC_WAKEUP, timeInMillis, pi);
}
我的笔记应用程序应该记住我的用户,并在用户设置的特定日期和时间在他们的笔记中发出通知。我的问题是我没有在设定的时间收到通知。
这是我的alarmManager.class(我在这里创建我的闹钟)
public class alarmManager {
public static void createAlarm(long timeInMillis, int requestCode, Intent i) {
PendingIntent pi = PendingIntent.getService(MainActivity.context, requestCode, i, PendingIntent.FLAG_UPDATE_CURRENT);
getAlarmManager().set(AlarmManager.RTC_WAKEUP, timeInMillis, pi);
}
public static void deleteAlarm(Intent i, int requestCode) {
if (doesPendingIntentExist(MainActivity.context, i, requestCode)) {
PendingIntent pi = PendingIntent.getService(MainActivity.context, requestCode, i, PendingIntent.FLAG_NO_CREATE);
pi.cancel();
getAlarmManager().cancel(pi);
}
}
private static AlarmManager getAlarmManager() {
return (AlarmManager) MainActivity.context.getSystemService(Context.ALARM_SERVICE);
}
private static boolean doesPendingIntentExist(Context context, Intent i, int requestCode) {
PendingIntent pi = PendingIntent.getService(context, requestCode, i, PendingIntent.FLAG_NO_CREATE);
return pi != null;
}
}
当用户创建新笔记时,这行代码会被触发(他们将需要的所有内容发送到我的 alarmManager.class)
Intent i = new Intent(MainActivity.context, NotificationService.class);
i.putExtra(NotificationService.i_UID, id);
i.putExtra(NotificationService.i_TEXT, title);
i.putExtra(NotificationService.i_CONTENT, content);
i.putExtra(NotificationService.i_REMINDEDATE, mUserReminderDate);
i.putExtra(NotificationService.i_REPEAT, repeatAlarmSelectedOption);
alarmManager.createAlarm(mUserReminderDate.getTime(), id.hashCode(), i);
当一切正常时,NotificationService.class 应该在选定的时间被调用。 (此处应向用户显示通知)
public class NotificationService extends IntentService {
public static final String i_UID = "uuid";
public static final String i_TEXT = "title";
public static final String i_CONTENT = "content";
public static final String i_REMINDEDATE = "remindeDate";
public static final String i_REPEAT = "repeatAlarm";
private String mTodoText, mTodoContent, mTodoUUID;
private Date mTodoDate;
private int mTodoRepeat;
private Intent processIntent;
public NotificationService() {
super("NotificationService");
}
@Override
protected void onHandleIntent(Intent intent) {
this.processIntent = intent;
mTodoText = intent.getStringExtra(i_TEXT);
mTodoContent = intent.getStringExtra(i_CONTENT);
mTodoUUID = intent.getStringExtra(i_UID);
mTodoDate = (Date) intent.getSerializableExtra(i_REMINDEDATE);
mTodoRepeat = intent.getIntExtra(i_REPEAT, 0);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification.Builder(this)
.setContentTitle(mTodoText)
.setContentText(mTodoContent)
.setSmallIcon(R.drawable.app_logo_transparent_bg)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_SOUND)
.build();
manager.notify(100, notification);
}
很遗憾,它不起作用。没有错误。没有通知。没有。
我希望有人能帮助我。
在我看来问题是当你创建一个 PendingIntent
:
PendingIntent pi = PendingIntent.getService(MainActivity.context, requestCode, i, PendingIntent.FLAG_UPDATE_CURRENT);
为了绝对确定,安排一个闹钟,然后 运行 来自 adb
以下命令:
adb shell dumpsys alarm
并搜索您的 PendingIntent
。如果找到它,请再安排一个时间警报并再安排一次 运行 命令。再次查找您的未决意向并确保它是一个新意向,然后尝试搜索之前预定的意向。如果 PendingIntent
有问题,您将只能找到最新的 PendingIntent
。
解法:
由于 AlarmManger
在比较 PendingIntents
时不比较传递给它的额外数据,而是比较请求代码、数据、操作和类别,因此您需要在每次安排新警报时更改其中一个。我的建议是将 uri
从数据库传递给每个新计划的 PendingIntent
。这将使它们中的每一个都独一无二,因此旧的不会在新的计划时被取消。总而言之,在代码调用方法 setData()
中参数 i
并将 uri 作为参数传递。您可以在方法中或从调用方法的 class 中执行此操作。它可能看起来像这样:
public static void createAlarm(long timeInMillis, int requestCode, Intent i, Uri uri) {
i.setData(uri)
PendingIntent pi = PendingIntent.getService(MainActivity.context, requestCode, i, PendingIntent.FLAG_UPDATE_CURRENT);
getAlarmManager().set(AlarmManager.RTC_WAKEUP, timeInMillis, pi);
}