应用知栏视图是如何夸进程显示到 SystemUI 的?
跨进程通讯的基础是 IPC ,通知服务(NotificationManagerService, 简称 NMS)也不离开 IPC ,核心架构还是 IPC 架构。
消息通道
- 应用做作为通知的发送端, 需要调用 NMS ,发通知。例如:
String channelId = "channel_1";
String tag = "ailabs";
int id = 10086;
int importance = NotificationManager.IMPORTANCE_LOW;
NotificationChannel channel = new NotificationChannel(channelId, "123", importance);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.createNotificationChannel(channel);
Notification notification = new Notification.Builder(MainActivity.this, channelId)
.setCategory(Notification.CATEGORY_MESSAGE)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("This is a content title")
.setContentText("This is a content text")
.setAutoCancel(true)
.build();
// 通知栏要显示的视图布局
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.layout_remoteviews);
notification.contentView = remoteViews;
manager.notify(tag, id , notification);
- SystemUI 作为通知的接收放需要注册监听器 INotificationListener 是监听通通知的一个 AIDL 接口,
NotificationListenerService 是一个监听管理服务,他的内部类 NotificationListenerWrapper 实现了
INotificationListener 接口。 例如: