Android Q提供了许多与共享相关的新功能。
Android Q中的ShareSheet已更改。直接共享API已替换为新的共享快捷方式API。现有的直接共享机制将继续有效,但优先级低于使用新API的任何应用程序。
共享快捷方式API允许应用程序提前发布直接共享目标,而不是按需检测结果。这是如何ShortcutManager
工作的。由于这两个API类似,我们扩展了ShortcutInfo
API以使这两个功能更容易使用。使用新API,您可以直接将类别或人员分配给共享目标。共享目标在系统中保留,直到相同的应用程序更新它们或卸载应用程序。
示例代码: SharingShortcuts
目前,仅支持发布直接共享目标的动态快捷方式。按照以下步骤使用新API发布直接共享目标:
ShortcutManager
或添加,访问,更新和删除快捷方式 ShortcutManagerCompat
。在AndroidX中使用兼容性库是首选方法,因为它提供了旧版Android的向后兼容性。
ShortcutInfo.Builder
包括新的和增强的方法,提供有关共享目标的其他信息:
setCategories()
这不是一种新方法,但现在类别也用于过滤可以处理共享意图或操作的快捷方式。有关详细信息,请参阅下面的声明共享目标。此字段是用作共享目标的快捷方式所必需的。
setLongLived()
指定快捷方式在取消发布或应用程序不可见时是否有效(作为动态或固定的快捷方式)。如果快捷方式存在很长时间,即使已取消发布作为动态快捷方式,也可以通过各种系统服务进行缓存。
setPerson()
, setPersons()
将一个或多个Person
对象与快捷方式关联。这可以用于更好地了解不同应用程序中的用户行为,并帮助框架中的潜在预测服务在ShareSheet中提供更好的建议。将人员信息添加到快捷方式是可选的,但强烈建议如果共享目标可以与人员关联。请注意,som共享目标(例如云)无法与人员关联。
对于典型的消息传递应用程序,应为每个联系人发布单独的共享目标(快捷方式),并且“人员”字段应包含联系人的信息。如果目标可以与多个人关联(如群聊),请将多个人添加到单个共享目标。
共享目标必须在应用程序的资源文件中声明,类似于 静态快捷方式定义。
在资源文件的根元素内添加共享目标定义以及其他静态快捷方式定义。每个
元素都包含有关共享数据类型,匹配类别以及将处理共享意图的目标类的信息。XML代码看起来像这样:
共享目标中的数据元素类似于intent过滤器中的数据规范。每个共享目标可以有多个类别,这些类别仅用于将应用程序发布的快捷方式与其共享目标定义进行匹配。类别可以具有任意应用程序定义的值。
如果用户在ShareSheet中选择与上述示例目标共享匹配的直接共享目标(快捷方式),则应用程序将获得以下共享意图:
Action: Intent.ACTION_SEND
ComponentName: {com.example.android.sharingshortcuts /
com.example.android.sharingshortcuts.SendMessageActivity}
Data: Uri to the shared content
EXTRA_SHORTCUT_ID:
如果用户从启动器快捷方式打开共享目标,则应用程序将获得在向共享快捷方式添加共享快捷方式时创建的意图ShortcutManagerCompat
。由于它是不同的意图,Intent.EXTRA_SHORTCUT_ID
因此无法使用,如果需要,您必须手动传递ID。
ShortcutManagerCompat
是一个新的AndroidX API,提供与旧的DirectShare API的向后兼容性。这是发布共享目标的首选方式。
为了能够使用兼容性库,应用程序的清单必须包含元数据选择器 - 目标 - 服务和intent-filters集。查看当前的Direct Share API。
此服务已在兼容性库中声明,因此用户无需在应用程序清单中声明该服务。但是,必须将从共享活动到服务的链接考虑为选择器目标提供者。
在以下示例中,ChooserTargetService的实现 androidx.core.content.pm.ChooserTargetServiceCompat
已在AndroidX中定义:
当应用程序共享内容时,它可以在Sharesheet UI中显示内容的可选预览。
预览可以包含标题,图像或两者。
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "Hello!");
// (Optional) Here we're setting the title of the content
sendIntent.putExtra(Intent.EXTRA_TITLE, "Send message");
// (Optional) Here we're passing a content URI to an image to be displayed
sendIntent.setClipData(contentUri);
sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
// Start the chooser to show the Sharesheet
startActivity(Intent.createChooser(sendIntent, null));
图像内容URI应该来自a FileProvider
,通常来自配置
。请参阅共享文件。
在示例应用程序中可以看到完整的 示例。
新API和旧版DirectShare API之间的主要区别是什么?
与旧的DirectShare API中使用的拉模型相比,新API使用推送模型。这使得在准备ShareSheet时更快地检索直接共享目标的过程。从应用程序开发人员的角度来看,在使用新API时,应用程序需要提前提供直接共享目标列表,并且每次应用程序的内部状态发生更改时都可能更新快捷方式列表(例如,如果在消息传递应用程序中添加新联系人)。
如果我不迁移使用新API会发生什么?
在Android Q及更高版本上,ShareSheet将优先考虑通过ShortcutManager(新API)提供的共享目标。因此,您发布的共享目标可能会隐藏在其他应用的共享目标之下,并且可能永远不会在共享时出
我可以在我的应用中使用新旧DirectShare API以实现向后兼容吗?
不要这样做!而是使用提供的支持库API(ShortcutManagerCompat
)。在检索共享目标时,混合使用两组API可能会导致意外/意外行为。
共享目标的已发布快捷方式与启动程序快捷方式的不同之处(长时间按启动器中的应用程序图标时,快捷方式的典型用法)?
为“共享目标”目的发布的任何快捷方式也是一个启动器快捷方式,并且在长按您的应用程序图标时将显示在菜单中。每个活动的最大快捷方式计数限制也适用于应用程序发布的快捷方式总数(共享目标和传统启动程序快捷方式的组合)。