通知是指 Android 在应用界面之外显示的消息,旨在向用户提供提醒、来自他人的通信或应用中的其他实时信息。用户可以点按通知以打开您的应用,或直接从通知中执行操作。
通知在状态栏中显示为图标,在抽屉式通知栏中显示更详细的条目,并在应用图标上显示一个标志。通知还会显示在配对的穿戴式设备上。
需要在清单文件中配置通知权限
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
从 Android 8.0(API 级别 26)开始,所有通知都必须分配到一个渠道。
// 获取 NotificationManager 对象来管理通知
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
"meMusic message", NotificationManager.IMPORTANCE_HIGH);
manager.createNotificationChannel(channel); //注册通知渠道
}
public NotificationChannel(String id, CharSequence name, @Importance int importance)
需要创建一个NotificationChannel对象,第一个id是唯一渠道 ID,第二个name是用户可见名称,可以自定义,第三个importance是通知重要程度,它是NotificationManager 中定义的常量属性值,主要有以下五个:
创建通知时需要用到NotificationManager 和 NotificationCompat 两个类。NotificationManager是状态栏通知的管理类,负责发通知,清除通知等操作。NotificationCompat可以兼容不同版本的 Notification。
// 1.获取 NotificationManager 对象来管理通知
NotificationManager manager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 2.通过NotificationCompat对象的构造器类来设置通知栏的属性
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNAL_ID)
.setContentTitle("这是通知标题")
.setContentText("这是通知内容")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setPriority(NotificationCompat.PRIORITY_MAX)
.setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.mipmap.ic_launcher));
// 3.创建notification对象
Notification notification = builder.build();
// 4.发送/更新通知内容
manager.notify(1888,notification); //1888为自定义通知唯一id
builder.setContentText("来新的消息了");
manager.notify(1888,notification);
设置通知的点击事件需要用PendingIntent的类,它和Intent一样,都能够执行某些动作,包括启动活动、服务,或发送广播等。 但它有和Intent也有些不同之处:Intent倾向于立即去执行某个动作,而PengdingIntent更倾向于在某个合适的时机去执行某个动作,即延迟执行Intent。
一般通过PendingIntent类的getActivity()、getBroadcast()或getService()其中一个方法获取实例。
//获取 PendingIntent 对象,意图是点击通知后打开应用主页面
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);
...
// 通过NotificationCompat对象的构造器类来设置通知栏的属性
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentIntent(pi) //设置通知点击事件
.setAutoCancel(true) //通知被点击后自动消失
public static PendingIntent getService(Context context, int requestCode, @NonNull Intent intent, @Flags int flags)
getService参数: 第一个Context,第二个requestCode,第三个Intent目的意图,第四个flags:
如果您的应用正在运行前台服务(一种在后台运行且生命周期长且用户可察觉到的 Service,如媒体播放器),则需要发出通知。此通知不能像关闭其他通知一样关闭。如需移除通知,必须停止运行服务或从前台状态中移除服务。