Java AlarmManager没有';t火
我的便笺应用程序应该在用户设置的特定日期和时间,在我的用户便笺上以通知的形式记住我的用户。我的问题是我没有在设定的时间收到通知。Java AlarmManager没有';t火,java,android,push-notification,alarmmanager,Java,Android,Push Notification,Alarmmanager,我的便笺应用程序应该在用户设置的特定日期和时间,在我的用户便笺上以通知的形式记住我的用户。我的问题是我没有在设定的时间收到通知。 这是我的alarmManager.class(我在这里创建我的报警) 当用户创建新便笺时,这些行将被激发(它们将所有需要的内容发送到我的alarmManager.class) 当一切正常时,NotificationService.class应该在选择的时间被调用。(此处通知应显示给用户) 不幸的是,它不起作用。没有错误。没有通知。没什么。 我希望有人能帮助我。在我看来
这是我的alarmManager.class(我在这里创建我的报警) 当用户创建新便笺时,这些行将被激发(它们将所有需要的内容发送到我的alarmManager.class) 当一切正常时,NotificationService.class应该在选择的时间被调用。(此处通知应显示给用户) 不幸的是,它不起作用。没有错误。没有通知。没什么。
我希望有人能帮助我。在我看来,问题是当你创建一个
挂起的内容时:
PendingIntent pi = PendingIntent.getService(MainActivity.context, requestCode, i, PendingIntent.FLAG_UPDATE_CURRENT);
为确保绝对可靠,请计划一个报警,然后从adb
运行以下命令:
adb外壳转储系统报警
并搜索您的pendingent
。若您找到了它,那个么再安排一次警报,然后再运行一次命令。再次查找您的待定意图,确保它是新的,并尝试搜索此先前计划的。如果pendingent
有问题,您只能找到最新的pendingent
解决方案:
由于AlarmManger
在比较PendingEvents
时,不会比较传递给它的额外数据,而是比较请求代码、数据、操作和类别,因此每次计划新报警时都需要更改其中一个。我的建议是将uri
从数据库传递到每个新计划的pendingent
。这将使每一个都是统一的,这样旧的一个就不会在新的计划发生时被取消。总之,在代码调用方法setData()
中调用参数i
,并将uri作为参数传递。您可以在方法中或从调用该方法的类中执行此操作。可能是这样的:
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);
}
您在调试中发现了什么?到底哪一部分失败了?createAlarm()
调用?警报真的被设置了吗?服务是否正在运行?闹钟准时响了吗?您是否根据当前时间仔细检查了您正在设置的timeInMillis
,以确保您计算的报警时间是合理的?您的清单中是否有用于通知服务的
元素?@MikeM。我不知道如何调试它。我唯一能说的是,没有显示致命错误。是的,在清单中我正确地添加了所有内容。但是等等。使用System.currentTimeMillis()
是什么意思?我只使用:mUserReminderDate.getTime()
OK,你必须学习基本的调试技巧;e、 例如,确定应用程序失败的具体方式和位置,利用IDE的调试器,调整值以暴露行为等。作为一个一般主题,这远远超出了堆栈溢出的范围,因此我要求您先进行一些研究、测试,并对解决问题进行全面调查,然后提出具体问题,详细的问题。不,这对我没有帮助。你检查过你的待定计划是否已安排好了吗?
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 pi = PendingIntent.getService(MainActivity.context, requestCode, i, PendingIntent.FLAG_UPDATE_CURRENT);
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);
}