我正在尝试进行每日通知,该通知将在特定时间显示。 不幸的是,它没有显示。
我尝试关注情侣装(也来自developer.android.com),并检查了已经问过的类似问题。为了节省时间,我正在使用Hawk库。
Intent intent = new Intent(getContext(), AlarmReceiver.class);
int notificationId = 1;
intent.putExtra("notificationId", notificationId);
PendingIntent alarmIntent = PendingIntent.getBroadcast(getContext(), 0,
intent,PendingIntent.FLAG_NO_CREATE);
AlarmManager alarm = (AlarmManager) getContext().getSystemService(getContext().ALARM_SERVICE);
switch (view.getId()) {
int hour = timePicker.getCurrentHour();
int minute = timePicker.getCurrentMinute();
// Create time
....
//set alarm
alarm.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartTime, AlarmManager.INTERVAL_DAY, alarmIntent);
Hawk.put("notification_hour", alarmStartTime);
break;
case R.id.cancel_button:
//cancel notification
break;
}
}
这里是AlarmReceiver类
public class AlarmReceiver extends BroadcastReceiver {
public AlarmReceiver () {
}
@Override
public void onReceive(Context context, Intent intent) {
sendNotification(context, intent);
}
private void sendNotification(Context con, Intent intent) {
int notificationId = intent . getIntExtra ("notificationId", 1);
String message = " message";
Intent mainIntent = new Intent(con, MainActivity.class);
PendingIntent contentIntent = PendingIntent . getActivity (con, 0, mainIntent, 0);
NotificationManager myNotificationManager =(NotificationManager) con . getSystemService (Context.NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(con);
builder.setSmallIcon(android.R.drawable.ic_dialog_info)
.setContentTitle("Reminder")
.setContentText(message)
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
.setContentIntent(contentIntent)
.setPriority(Notification.PRIORITY_MAX)
.setDefaults(Notification.DEFAULT_ALL);
myNotificationManager.notify(notificationId, builder.build());
}
}
答案 0 :(得分:2)
在OREO中,他们重新设计了通知,以提供一种更轻松,更一致的方式来管理通知行为和设置。其中一些更改包括:
通知渠道:Android 8.0引入了通知渠道,可让您为要显示的每种通知类型创建用户可定制的渠道。 通知点:Android 8.0引入了对在应用启动器图标上显示点或徽章的支持。通知点反映了用户尚未被解雇或采取行动的通知的存在。
延后:用户可以延后通知,这会使它们消失一段时间后再出现。通知以与第一次出现时相同的重要性重新出现。
消息传递样式:在Android 8.0中,使用MessagingStyle类的通知以折叠形式显示更多内容。您应该将MessagingStyle类用于与消息相关的通知。 在这里,我们创建了NotificationHelper类,该类需要使用Context作为构造函数参数。 NOTIFICATION_CHANNEL_ID变量已经初始化,以便将channel_id设置为NotificationChannel。
方法 createNotification(...)需要标题和消息参数,以便设置通知的标题和内容文本。为了处理通知单击事件,我们创建了未完成的对象,该对象重定向到SomeOtherActivity.class。
通知通道使您可以为要显示的每种通知类型创建用户可定制的通道。因此,如果android版本大于或等于8.0,我们必须创建NotificationChannel对象并将其设置为NotificationManager的createNotificationChannel(…)setter属性。
public class NotificationHelper {
private Context mContext;
private NotificationManager mNotificationManager;
private NotificationCompat.Builder mBuilder;
public static final String NOTIFICATION_CHANNEL_ID = "10001";
public NotificationHelper(Context context) {
mContext = context;
}
/**
* Create and push the notification
*/
public void createNotification(String title, String message)
{
/**Creates an explicit intent for an Activity in your app**/
Intent resultIntent = new Intent(mContext , SomeOtherActivity.class);
resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent resultPendingIntent = PendingIntent.getActivity(mContext,
0 /* Request code */, resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder = new NotificationCompat.Builder(mContext);
mBuilder.setSmallIcon(R.mipmap.ic_launcher);
mBuilder.setContentTitle(title)
.setContentText(message)
.setAutoCancel(false)
.setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
.setContentIntent(resultPendingIntent);
mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O)
{
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.RED);
notificationChannel.enableVibration(true);
notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
assert mNotificationManager != null;
mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
mNotificationManager.createNotificationChannel(notificationChannel);
}
assert mNotificationManager != null;
mNotificationManager.notify(0 /* Request Code */, mBuilder.build());
}
只需包含一个NotificationChannel并为其设置一个频道ID。