Android Q 提供了许多与共享相关的新功能。
Sharing Shortcuts API
Android Q 中的 ShareSheet 已更改。Direct Share API 已替换为新的 Sharing Shortcuts API。现有的“直接共享”机制将继续有效,但优先级低于所有使用新版 API 的应用。
Sharing Shortcuts API 允许应用提前发布直接共享目标,而不是被动地按需检索结果。这就是 ShortcutManager 的工作原理。由于这两个 API 类似,因此我们扩展了 ShortcutInfo API 以让这两个功能更易于使用。借助新版 API,您可以直接将类别或人员分配到共享目标。在同一应用更新共享目标或此应用被卸载之前,这些共享目标会一直保留在系统中。
示例代码:SharingShortcuts
发布直接共享目标
目前,仅支持使用 Sharing Shortcuts API 发布直接共享目标。要使用该新版 API 发布直接共享目标,请按以下步骤操作:
- 在应用的 XML 资源文件中声明 share-target 元素。有关详情,请参阅下面的声明共享目标部分。
- 将动态快捷方式连同匹配的类别一起发布到声明的 share-target。可以使用 AndroidX 中的 ShortcutManager 或 ShortcutManagerCompat 来添加、访问、更新和移除快捷方式。使用 AndroidX 中的兼容库是首选方式,因为它向后兼容旧版 Android 系统。
DirectShare API
ShortcutInfo.Builder 包含增强的新方法,可以提供与共享目标有关的其他信息:
这不是一种新方法,但现在类别也用于过滤可以处理共享 Intent 或操作的快捷方式。有关详情,请参阅下面的声明共享目标部分。要用作共享目标的快捷方式需要此字段。
指定快捷方式在取消发布或被应用设为不可见(作为动态或固定快捷方式)后是否有效。如果某个快捷方式长期存在,则可能被各种系统服务缓存,即使已取消发布为动态快捷方式也是如此。
将一个或多个 Person 对象关联到快捷方式。这可以用于更好地了解不同应用中的用户行为,并帮助框架中的潜在预测服务在 ShareSheet 中提供更好的建议。将 Person 信息添加到快捷方式属于可选操作,但如果可以将共享目标与 Person 关联,我们强烈建议您执行这项操作。请注意,某些共享目标(例如云)无法与 Person 相关联。
对于典型的短信应用,您应该为每个联系人发布单独的共享目标(快捷方式),并且 Person 字段应该包含相应联系人的信息。如果目标可以与多个人相关联(例如群聊),请将多个 Person 添加到单个共享目标。
声明共享目标
共享目标必须在应用的资源文件中声明,类似于静态快捷方式定义。将共享目标定义连同其他静态快捷方式定义一起添加到资源文件中的 <shortcuts> 根元素中。每个 <share-target> 元素都包含与共享数据类型、匹配类别以及将处理共享 Intent 的目标类有关的信息。XML 代码如下所示:
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<share-target android:targetClass="com.example.android.sharingshortcuts.SendMessageActivity">
<data android:mimeType="text/plain" />
<category android:name="com.example.android.sharingshortcuts.category.TEXT_SHARE_TARGET" />
</share-target>
</shortcuts>
共享目标中的数据元素类似于 Intent 过滤器中的数据规范。每个共享目标都可以有多个类别,这些类别仅用于将应用的已发布快捷方式匹配到相应的共享目标定义。类别可以具有应用定义的任意值。
如果用户在 ShareSheet 中选择与上述 share-target 示例相匹配的直接共享目标(快捷方式),则应用将获得以下共享 Intent:
Action: Intent.ACTION_SEND
ComponentName: {com.example.android.sharingshortcuts /
com.example.android.sharingshortcuts.SendMessageActivity}
Data: Uri to the shared content
EXTRA_SHORTCUT_ID: <ID of the selected shortcut>
如果用户从启动器快捷方式打开共享目标,则应用将获得在将共享快捷方式添加到 ShortcutManagerCompat 时创建的 Intent。由于这是另一个 Intent,因此 Intent.EXTRA_SHORTCUT_ID 将不可用;如果需要相应 ID,您必须手动传递。
AndroidX 中的 DirectShare
ShortcutManagerCompat 是一个新版 AndroidX API,它可以向后兼容旧版 DirectShare API。这是发布共享目标的首选方式。
为了能够使用兼容性内容库,应用清单必须包含元数据 chooser-target-service 和 intent-filter 集。请参阅当前的 Direct Share API。
此服务已在兼容性内容库中声明,因此用户无需在应用清单中声明此服务。但是,必须将从共享 Activity 到服务的链接视为选择器目标提供程序。
在以下示例中,ChooserTargetService 的实现为 androidx.core.content.pm.ChooserTargetServiceCompat,其已在 AndroidX 中定义:
<activity
android:name=".SendMessageActivity"
android:label="@string/app_name"
android:theme="@style/SharingShortcutsDialogTheme">
<!-- This activity can respond to Intents of type SEND -->
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<!-- Only needed if you import the sharetarget AndroidX library that
provides backwards compatibility with the old DirectShare API.
The activity that receives the Sharing Shortcut intent needs to be
taken into account with this chooser target provider. -->
<meta-data
android:name="android.service.chooser.chooser_target_service"
android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
</activity>
常见问题解答
新版 API 和旧版 DirectShare API 之间的主要区别是什么?
新版 API 采用的是推模式,而旧版 DirectShare API 采用的是拉模式。在准备 ShareSheet 时,使用新版 API 检索直接共享目标的过程要比使用旧版 API 快得多。从应用开发者的角度来看,在使用新版 API 时,应用需要提前提供直接共享目标列表,并且每当应用的内部状态发生变化(例如,如果在短信应用中添加了新联系人)时都可能需要更新快捷方式列表。
如果我不迁移到使用新版 API,会出现什么情况?
在 Android Q 及更高版本上,ShareSheet 将为通过 ShortcutManager(新版 API)提供的共享目标提供更高的优先级。因此,您发布的共享目标可能会被其他应用的共享目标淹没,并且可能永远不会在进行共享时显示。
我可以在我的应用中同时使用旧版和新版 DirectShare API 以实现向后兼容吗?
请不要这样做!相反,请使用所提供的支持库 API (ShortcutManagerCompat)。混用这两组 API 可能会导致在检索共享目标时出现不必要/意外的行为。
共享目标的已发布快捷方式与启动器快捷方式(长按启动器中的应用图标时通常使用这些快捷方式)有何不同?
为“共享目标”而发布的任何快捷方式同时也是一种启动器快捷方式,并且在长按您的应用图标时会显示在菜单中。每个 Activity 的快捷方式计数上限也适用于应用要发布的快捷方式的总数(共享目标和旧版启动器快捷方式数之和)。