我的部分应用程序包含一个自定义锁屏,需要像正常的android锁屏一样显示通知。
在Android 6之前一切正常,我使用NotificationListenerService来检索通知contentView和bigContentView(RemoteViews)。我在我的自定义RecyclerView适配器上使用它们来创建一个通知列表,其中包含服务列出的相同通知:
//this is called by NotificationListenerService
@Override
public void onNotificationPosted(StatusBarNotification sbn) {
AddNotification(sbn);
}
然后使用StatusBarNotification检索contentView和bigContentView并将它们应用到我的自定义循环视图列表视图中:
/**
* Add notification into recycleview
* @param sbn notification to add
*/
private void AddNotification(StatusBarNotification sbn)
{
Notification notification = sbn.getNotification();
if(notification==null) return;
if(notification.bigContentView!=null) {
//apply bigContentView to my recycleview list notification view
myListView.notificationview = notification.bigContentView.apply(myContext(), myNotificationLayout);
}
else if(notification.contentView!=null) {
//apply contentView to my recycleview list notification view
myListView.notificationview = notification.contentView.apply(myContext(), myNotificationLayout);
}
//notify recycleview of a new item inserted
notifyItemInserted(0);
}
Android 7已经不再可能了,因为从Android N开始(如Android文档中所述),contentView和bigContentView可能为null(实际上它们是)。 这些非常有用,因为你可以复制通知视图,这些视图也可能包含一些复杂的动作控件(例如媒体播放器通知,例如播放/暂停/停止控制):
在Android 7及更高版本中是否可以使用与原始通知相同的内容创建视图?
如何复制RemoteView行为?是否可以检索所有通知信息(图形,文本,图标,意图等)?
答案 0 :(得分:1)
经过调查,除非发件人使用自定义布局调用setCustomContentView()和/或setCustomBigContentView(),否则无法检索通知的全部内容(即检索通知Remoteviews)。
也就是说,这里唯一的解决方案是使用与原始通知相同的信息重新创建一个Remoteview(或两个,如果你想同时拥有紧凑版和扩展版)。为此,从Bundle通知extras中提取的信息将用于填充您应创建的XML通知布局,类似于以下内容:
此外,您必须检查附加组件Bundle是否包含Notification.EXTRA_TEMPLATE键,如果是,请检查其样式。 XML布局应该复制不同类型的窗框(MediaStyle,InboxStyle,BigPictureStyle)并相应地填充所有字段。