gpt4 book ai didi

java - 在 Android KitKat 中调用 setGroup() 时未显示通知

转载 作者:IT老高 更新时间:2023-10-28 23:23:07 28 4
gpt4 key购买 nike

我正在测试可堆叠通知 (Stacking Notifications article) .

我检测到在某些情况下,在运行 android 4.X KitKat 的设备中调用 notify() 后通知不会显示。

为了简单的问题,我创建了这段代码来模拟通知(button1)和带有摘要的第二个通知(button2)

private final static int NOTIFICATION_ID_A=6;
private final static int NOTIFICATION_ID_B = 7;
private final static int NOTIFICATION_ID_SUMMARY = 8;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showNotif(NOTIFICATION_ID_A,false);
}
});
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showNotif(NOTIFICATION_ID_B,false);
showNotif(NOTIFICATION_ID_SUMMARY,true);
}
});
}

private void showNotif(int notificationId,boolean groupSummary) {
CharSequence title="Title "+notificationId;
CharSequence message="Message "+notificationId;
NotificationCompat.Builder notifBuilder = new NotificationCompat.Builder(this);
notifBuilder.setSmallIcon(R.drawable.icon_notifications);
notifBuilder.setContentTitle(title);
notifBuilder.setContentText(message);
notifBuilder.setGroupSummary(groupSummary);
notifBuilder.setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT));
notifBuilder.setGroup("group_" + 1);
NotificationManagerCompat.from(this).notify(notificationId, notifBuilder.build());
}

这个想法是先按下button1,然后按下button2。它在 android 5.0+ 中运行良好,首先显示第一个通知,并在单击第二个按钮时显示摘要,但在 Android 4.X 中,button1 不显示任何内容。

哪里出错了?

谢谢

最佳答案

对此的简短回答是,支持库不会自动支持在 KitKat 设备上显示堆叠通知。

由于您在此处寻求启发,因此我基于对运行 Android 4.4.2 的两台设备的测试得出的发现。我也在使用 AppCompat 23.1.1。

当您深入研究库的源代码时,您会发现当显示通知时,它会使用名为 SideChannel 的东西。或 NotificationManager直接显示通知。以下是NotificationManagerCompat.notify显示此的引用方法:

public void notify(String tag, int id, Notification notification) {
// MY COMMENT: true when the notification has the extra
// NotificationCompatJellybean.EXTRA_USE_SIDE_CHANNEL set to true.
if (useSideChannelForNotification(notification)) {
pushSideChannelQueue(new NotifyTask(mContext.getPackageName(), id, tag, notification));
// Cancel this notification in notification manager if it just transitioned to being
// side channelled.
IMPL.cancelNotification(mNotificationManager, tag, id);
} else {
// MY COMMENT: this calls notificationManager.notify(id, notification); in the base implementation
IMPL.postNotification(mNotificationManager, tag, id, notification);
}
}

现在,当您在未设置组的情况下显示通知时,通知会使用有效的通知管理器显示,但如果设置了组,它将尝试使用侧 channel 发送通知并如上述方法所示,取消使用通知管理器显示的任何通知。

NotificationCompatKitKat.Builder 中找到了设置组时使用侧 channel 的证据您将在其中看到以下代码:

if (groupKey != null) {
mExtras.putString(NotificationCompatJellybean.EXTRA_GROUP_KEY, groupKey);
if (groupSummary) {
mExtras.putBoolean(NotificationCompatJellybean.EXTRA_GROUP_SUMMARY, true);
} else {
mExtras.putBoolean(NotificationCompatJellybean.EXTRA_USE_SIDE_CHANNEL, true);
}
}

在您查看 pushSideChannelQueue(...) 之前,这一切似乎都没什么大不了的。方法在使用 SideChannel 显示通知时执行.

它最终会寻找可以处理 android.support.BIND_NOTIFICATION_SIDE_CHANNEL 操作的服务。默认情况下没有一个,因此该方法只是返回。这就是导致通知永远不会显示的原因。

有一个NotificationCompatSideChannelService您可以根据documentation 实现的兼容性库中的抽象类如果你想自己写SideChannelService但看起来你最好不要在 KitKat 和以前的设备中使用分组通知。

关于java - 在 Android KitKat 中调用 setGroup() 时未显示通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31407607/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com