Java 将通知安排到特定日期和时间
我是的开发者,我正在尝试在我的应用程序中实现通知提醒功能。这个想法是,用户可以为自己设置一个提醒,提醒自己给列表中的某个特定的人打电话。首先,在实现此功能时,通知会立即显示,而不会进行计划-这是由于错误的值设置导致了负毫秒。但是,现在我已经纠正了这一点,通知根本不会被安排,即使我有正确的毫秒值给AlarmManager 安排通知的方法如下所示:Java 将通知安排到特定日期和时间,java,android,notifications,alarmmanager,Java,Android,Notifications,Alarmmanager,我是的开发者,我正在尝试在我的应用程序中实现通知提醒功能。这个想法是,用户可以为自己设置一个提醒,提醒自己给列表中的某个特定的人打电话。首先,在实现此功能时,通知会立即显示,而不会进行计划-这是由于错误的值设置导致了负毫秒。但是,现在我已经纠正了这一点,通知根本不会被安排,即使我有正确的毫秒值给AlarmManager 安排通知的方法如下所示: public void scheduleReminder(Notification notification, String date, String
public void scheduleReminder(Notification notification, String date, String time){
String[] dateArray = date.split("/");
String[] timeArray = time.split(":|\\s+");
Date currentDate = new Date();
int notHour;
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.clear();
if(timeArray[2].equals("PM")){
notHour = Integer.parseInt(timeArray[0]);
notHour = notHour + 12;
cal.set(Calendar.YEAR, Integer.parseInt(dateArray[2]));
cal.set(Calendar.MONTH, Integer.parseInt(dateArray[0]) - 1);
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateArray[1]));
cal.set(Calendar.HOUR_OF_DAY, notHour);
cal.set(Calendar.MINUTE, Integer.parseInt(timeArray[1]));
}
else{
cal.set(Calendar.YEAR, Integer.parseInt(dateArray[2]));
cal.set(Calendar.MONTH, Integer.parseInt(dateArray[0]) - 1);
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateArray[1]));
cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeArray[0]));
cal.set(Calendar.MINUTE, Integer.parseInt(timeArray[1]));
}
Date reminderDate = cal.getTime();
long diffInMillis = reminderDate.getTime() - currentDate.getTime();
Intent notificationIntent = new Intent(this, NotificationPublisher.class);
notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, 1);
notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + diffInMillis, pendingIntent);
}
我的广播接收器类别如下:
package groovinchip.com.callmanager;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class NotificationPublisher extends BroadcastReceiver {
public static String NOTIFICATION_ID = "notification-id";
public static String NOTIFICATION = "notification";
@Override
public void onReceive(Context context, Intent intent) {
NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = intent.getParcelableExtra(NOTIFICATION);
int id = intent.getIntExtra(NOTIFICATION_ID, 0);
notificationManager.notify(id, notification);
}
}
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<receiver android:name="groovinchip.com.callmanager.NotificationPublisher"
android:enabled="true">
</receiver>
相关安卓清单声明如下:
package groovinchip.com.callmanager;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class NotificationPublisher extends BroadcastReceiver {
public static String NOTIFICATION_ID = "notification-id";
public static String NOTIFICATION = "notification";
@Override
public void onReceive(Context context, Intent intent) {
NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = intent.getParcelableExtra(NOTIFICATION);
int id = intent.getIntExtra(NOTIFICATION_ID, 0);
notificationManager.notify(id, notification);
}
}
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<receiver android:name="groovinchip.com.callmanager.NotificationPublisher"
android:enabled="true">
</receiver>
我很困惑为什么这不起作用——我仔细研究了我的谷歌搜索结果,试图找出答案。我在以下两种情况之间切换:
1) 使用系统设置AlarmManager
。运行时间\u实时\u唤醒
2) 传递SystemClock.elapsedRealTime()+diffinmilies
3) 仅传递diffInMillis
4) 传递一个只表示几秒钟的整数值,而不是diffInMillis
,以查看它是否有效
有人能帮忙吗?非常感谢你 创建通知时,是否设置了频道id?如果您在API 26上进行测试,则如果广播接收器中没有一组a频道,则警报不会熄灭 我有两种方法可以创建和设置来自时间选择器的提醒和用户选择的警报。这是他们的源代码
private void createReminder(Notification notification) {
Intent notificationIntent = new Intent(this, NotificationPublisher.class);
notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, 1);
notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
long delay = alarmCalendar.getTimeInMillis() - Calendar.getInstance().getTimeInMillis();
long futureInMillis = SystemClock.elapsedRealtime() + delay;
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
}
private Notification getNotification() {
String channelId = "Reminders";
PendingIntent newEntryActivityPendingIntent = PendingIntent.getActivity(this, 1, new Intent(this, NewEntryActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
.setContentTitle(getString(R.string.app_name))
.setContentText(getString(R.string.reminder_content))
.setTicker(getString(R.string.app_name))
.setSmallIcon(R.drawable.notebook_notification_white)
.setDefaults(Notification.DEFAULT_SOUND)
.setAutoCancel(true)
.setContentIntent(newEntryActivityPendingIntent);
Log.i(TAG, "notification built");
return builder.build();
}
在我的应用程序中,我有一个通知提醒,我有一个单独的类为我的广播接收器类似于你,这是我的样子
public class NotificationPublisher extends BroadcastReceiver {
private static final String TAG = "NotificationPublisher";
public static String NOTIFICATION_ID = "notification-id";
public static String NOTIFICATION = "notification";
@Override
public void onReceive(Context context, Intent intent) {
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= 26) {
NotificationChannel channel = new NotificationChannel("Reminders", "Reminders", NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(channel);
}
Notification notification = intent.getParcelableExtra(NOTIFICATION);
int id = intent.getIntExtra(NOTIFICATION_ID, 0);
Log.i(TAG, "notification sent");
notificationManager.notify(id, notification);
}
}
从外观上看,几乎和你的一模一样
这对我很有效。如果我能提供任何其他帮助,请告诉我。当您创建通知时,是否正在设置频道id?如果您在API 26上进行测试,则如果广播接收器中没有一组a频道,则警报不会熄灭 我有两种方法可以创建和设置来自时间选择器的提醒和用户选择的警报。这是他们的源代码
private void createReminder(Notification notification) {
Intent notificationIntent = new Intent(this, NotificationPublisher.class);
notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, 1);
notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
long delay = alarmCalendar.getTimeInMillis() - Calendar.getInstance().getTimeInMillis();
long futureInMillis = SystemClock.elapsedRealtime() + delay;
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent);
}
private Notification getNotification() {
String channelId = "Reminders";
PendingIntent newEntryActivityPendingIntent = PendingIntent.getActivity(this, 1, new Intent(this, NewEntryActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
.setContentTitle(getString(R.string.app_name))
.setContentText(getString(R.string.reminder_content))
.setTicker(getString(R.string.app_name))
.setSmallIcon(R.drawable.notebook_notification_white)
.setDefaults(Notification.DEFAULT_SOUND)
.setAutoCancel(true)
.setContentIntent(newEntryActivityPendingIntent);
Log.i(TAG, "notification built");
return builder.build();
}
在我的应用程序中,我有一个通知提醒,我有一个单独的类为我的广播接收器类似于你,这是我的样子
public class NotificationPublisher extends BroadcastReceiver {
private static final String TAG = "NotificationPublisher";
public static String NOTIFICATION_ID = "notification-id";
public static String NOTIFICATION = "notification";
@Override
public void onReceive(Context context, Intent intent) {
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= 26) {
NotificationChannel channel = new NotificationChannel("Reminders", "Reminders", NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(channel);
}
Notification notification = intent.getParcelableExtra(NOTIFICATION);
int id = intent.getIntExtra(NOTIFICATION_ID, 0);
Log.i(TAG, "notification sent");
notificationManager.notify(id, notification);
}
}
从外观上看,几乎和你的一模一样
这对我很有效。如果我能提供其他帮助,请告诉我。查看OneSignal查看OneSignal这确实是个问题。它现在正在我的Oreo设备上工作,尽管它正在我的设备上崩溃