最简单的 Notification
1、演示
java
final String CHANNEL_ID = "my_test_channel";
int notificationId = 1;
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = "my test channel";
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
notificationManager.createNotificationChannel(channel);
}
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("系统通知")
.setContentText("Hello World")
.setSmallIcon(R.drawable.ic_notification)
.build();
notificationManager.notify(notificationId, notification);
java
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
2、解读
java
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- 获取通知管理器
java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
...
}
- 如果系统版本大于 Android 8.0(API 26),必须创建通知渠道才能发送通知
java
CharSequence name = "my test channel";
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
- 创建通知渠道,所需参数:通知渠道的唯一标识符、通知渠道的显示名称、通知渠道的重要等级
java
notificationManager.createNotificationChannel(channel);
- 将通知渠道注册到系统,这个操作只需在应用首次运行时执行一次即可
java
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
- 创建通知,传入通知渠道的唯一标识符,指明该通知属于哪个通知渠道
java
.setContentTitle("系统通知")
.setContentText("Hello World")
.setSmallIcon(R.drawable.ic_notification)
- 设置通知的标题,设置通知的正文内容,设置通知的图标
java
notificationManager.notify(notificationId, notification);
- 发送通知,传入通知的唯一标识符
Application Context 应用于 Notification
1、演示
java
Context context = getApplicationContext();
final String CHANNEL_ID = "my_test_channel";
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "my test channel", NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(channel);
}
Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
.setContentTitle("系统通知")
.setContentText("Hello World")
.setSmallIcon(R.drawable.ic_notification)
.build();
notificationManager.notify(1, notification);
java
Context context = getApplicationContext();
final String CHANNEL_ID = "my_test_channel";
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "my test channel", NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(channel);
}
Intent intent = new Intent(context, TargetActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE);
Notification notification = new NotificationCompat.Builder(context, CHANNEL_ID)
.setContentTitle("系统通知")
.setContentText("Hello World")
.setSmallIcon(R.drawable.ic_notification)
.setContentIntent(pendingIntent)
.build();
notificationManager.notify(1, notification);
2、小结
-
通知系统会持有 Notification Builder 中的 Context
-
如果使用 Activity Context,即使 Activity 被销毁,通知系统仍会持有它的引用
-
通知的生命周期通常比 Activity 更长,即使应用在后台,通知也应能正常显示
-
Application Context 能保证通知系统在整个应用生命周期内正常工作