-
创建Notification
初始化 NotificationManager 用来管理 Notification
NotificationManager manager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
①构建 Android 8.0渠道
//适配安卓8.0的消息渠道
String channelID = "channelID";
CharSequence channelName = "channelName";
// 如果想更改渠道设置的声音或震动等属性
// 如果已经创建此Id的Channel,只会复用旧属性,新更改并不会生效
// ①清除应用数据或者卸载重装 会生效
// ②更换channelID 会生效
// *** 先删除ID在重新创建 并不会生效 不生效 不生效
// notificationManager.deleteNotificationChannel(channelID);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
// 无通知音
channel.setSound(null, Notification.AUDIO_ATTRIBUTES_DEFAULT);
// 默认通知音
channel.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION), Notification.AUDIO_ATTRIBUTES_DEFAULT);
// 设置通知出现时的闪灯(如果 android 设备支持的话)
channel.enableLights(true);
channel.setLightColor(Color.RED);
// 设置通知出现时的震动(如果 android 设备支持的话)
channel.enableVibration(true);
channel.setVibrationPattern(new long[]{100, 200});
// 创建渠道
manager.createNotificationChannel(channel);
}
②初始化NotificationCompat.Builder
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channelID);
③配置NotificationCompat.Builder基本属性
.setContentTitle("我是标题")
.setContentText("我是内容")
// 图标
.setSmallIcon(R.mipmap.app_logo);
④配置 < 8.0 版本的声音、震动等属性
// 设置铃声及震动效果等(不设置默认无声音、震动)
.setDefaults(NotificationCompat.DEFAULT_ALL);
// 设置铃声(无)
.setSound(null)
// 设置震动
.setVibrate(new long[]{100, 200})
// 设置通知出现时的闪灯(如果 android 设备支持的话)
// int argb = 0xffff0000; // led灯光颜色
// int onMs = 300; // led亮灯持续时间
// int offMs = 100; // led熄灯持续时间
.setLights(argb,onMs,offMs);
-
自定义布局
初始化 RemoteViews
// 参数1:包名 参数2:自定义布局的资源Id
RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.notification_control);
自定义布局动态设置文字、图片资源
// 参数1:自定义布局中的控件id 参数2:图片资源
contentView.setImageViewResource(R.id.play, R.mipmap.zanting);
// 参数1:自定义布局中的控件id 参数2:文本内容
contentView.setTextViewText(R.id.title, "文本");
自定义布局中的控件的点击事件
// 参数1:自定义布局中的控件id 参数2:pendingIntent
contentView.setOnClickPendingIntent(R.id.last, pendingIntent);
NotificationCompat.Builder加载自定义布局
builder.setCustomContentView(contentView);
-
显示Notification
设置点击通知的响应
builder.setContentIntent(pendingIntent);
设置提醒标识符Flags 可用"|"符号多个标识拼接
必须设置 Notification.FLAG_ONGOING_EVENT 否则oppo手机不显示通知
Notification notification = musicBuilder.build();
notification.flags = Notification.FLAG_ONGOING_EVENT;
// 点击清除、侧滑 不清除通知提醒 Notification.FLAG_NO_CLEAR;
// 点击通知后自动取消通知提醒 Notification.FLAG_AUTO_CANCEL
显示通知
// notifyId 一样 会覆盖上一条通知
manager.notify(notifyId, notification);
移除通知
manager.cancel(notifyId);
-
PendingIntent
PendingIntent可以看作是对Intent的一个封装,但它不是立刻执行某个行为,而是满足某些条件或触发某些事件后才执行指定的行为。
①PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags) 用于启动一个Activity的PendingIntent对象.
②PendingIntent.getService(Context context, int requestCode, Intent intent, int flags)用于启动一个Service的PendingIntent对象
③PendingIntent.getBroadcast(Context context, int requestCode, Intent intent, int flags)用于向BroadcastReceiver的发送广播的PendingIntent对象
-
判断应用是否开启通知栏
public static boolean isNotificationEnabled(Context context) {
NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context);
return notificationManagerCompat.areNotificationsEnabled();
}
跳转系统应用权限界面
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", getPackageName(), null));
startActivity(intent);