根据“人物和对话”</a>,Android 11 上的对话通知的先决条件之一如下:
该通知与有效的长期动态或缓存的共享快捷方式相关联。通知可以通过调用
setShortcutId()
或来设置这种关联setShortcutInfo()
。
但我只能有 5 个快捷方式。这是否意味着我不能为超过 5 人发送对话通知?
看来您实际上可以发布超过 5 个快捷方式。您可以通过设置较高的数字来制作排名低于所有其他通知的通知rank
,并使用shortcutManager.pushDynamicShortcut()
.
如果您没有任何启动器快捷方式,上述操作将创建一个。如果您不希望这样,建议...只需删除您刚刚创建的快捷方式:
问:我的快捷方式会出现在长按应用启动器上下文菜单中吗?答:他们可以根据他们的等级,但如果您不希望在启动器上显示快捷方式,您可以在发送通知时
ShortcutManager#removeDynamicShortcuts()
或之后删除快捷方式。#removeAllDynamicShortcuts()
您还可以对排名较高的其他应用快捷方式进行排名,因此只有那些动态快捷方式才会出现在启动器上。
下面是一些想法。普通手机上的快捷方式似乎会出现在三个地方:
这些快捷方式都来自同一个池。这是有道理的,但由于每个快捷方式只有一个等级,这意味着启动器列表和直接共享列表是相同的。这是您可能不想要的;您可能会在一个对话中分享更多内容,但更频繁地打开另一个对话。在我的应用程序中,我通过以下方式解决了这个问题:
shortcutManager.pushDynamicShortcut()
;更新快捷方式。如果已存在具有相同 id 的快捷方式,则会对其进行更新。我使用旧的细节shortcutManager.getShortcuts()
。
这允许拥有完全不同的启动器和直接共享快捷方式,并发布许多对话通知。
一些随机观察:
向对话通知添加快捷方式 ID 也会将其图标添加到通知中,即使您没有明确设置。
shortcutManager.maxShortcutCountPerActivity
实际上在我的设备(LineageOS)上返回 15(!),即使启动器和直接共享仅显示常规 4 个图标。
如果您更新快捷方式名称和/或图标,大多数情况下它会立即在启动器中更新。这包括固定的快捷方式。
用于IconCompat.createWithAdaptiveBitmap()
创建适用于各种图标形状的图标。系统会保留图像,您不需要保留它。请参阅该方法的文档。
还有两种方法需要注意:
IconCompat.createWithAdaptiveBitmapContentUri()
与上述相同,但适用于内容 URI。这对于创建Person
通知很有用,因为这允许不将图标保留在内存中。不过貌似没有办法将URI权限传递给快捷方式管理器,所以这个方法不能用。(如果我在这里错了,请纠正我!)
编辑:如果您在内联(直接)回复后取消通知,系统可能会决定将您的回复添加到它而不是实际取消它。显然,此时它可能会失去 URI 权限。在 URI 上调用此解决方法似乎有所帮助:
fun Uri.grantReadPermissionToSystem() {
applicationContext.grantUriPermission("com.android.systemui", this,
Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
IconCompat.createWithData()
从压缩图像数据 (PNG/JPEG) 创建内存高效图标。然而,它不是自适应的。而且,用它制作的图标根本无法使用ShortcutManager
。
另外不要忘记查看People 示例应用程序的自述文件。