如何实现Android Slice?
Google 在 Android Pie 中引入了一个名为Slices的新 API。切片是 Android Jetpack 支持库的一个组件。 Slices 是一个较小的 UI 模板,用于在 Google 搜索应用中展示您的应用内容。它使用户能够在您的应用程序之外更快地完成任务。在本文中,我们将介绍如何在您的应用中使用 Slices。 Slices 支持各种 LiveData、Deeplink、Scrollable 布局等。让我们开始这篇文章。
GeekTip: Before you can construct your own slice, you’ll need Android Studio 3.1 and above, as well as a Kotlin version of 1.2.30 or above.
从你的第一个 Slice 开始
在应用程序的构建中包含依赖项:
dependencies {
implementation "androidx.slice:slice-builders-ktx:(latest version)"
}
我们现在必须构建一个扩展 SliceProvider 的文件。这类似于为应用程序提供一个切片。切片是应用程序信息和活动的一部分,可以在 Android 系统界面中的应用程序外部或其他应用程序内显示。 Uri 标识切片,而 SliceProvider 使您的应用程序能够基于 uri 提供切片。要添加新的提供者,请转到NEW -> OTHERS -> SLICEPROVIDER ,它将在生成时添加到 Manifest。
...
...
...
每个 Slice 都分配了一个 URI。因此,当应用程序想要显示切片时,它会向应用程序发送带有关联 URI 的绑定请求。然后程序使用 onBindSlice 构造 Slice。 sliceAttached 方法似乎是,
Kotlin
override fun sliceAttached(sliceUri: Uri): Slice? {
val gfgAction = doSomething()
return if (sliceUri.path == "/gfg") {
list(context, sliceUri, ListBuilder.INFINITY) {
row {
primaryAction = activityAction
title = "Hello Geeks for Geeks."
}
}
} else {
list(context, sliceUri, ListBuilder.INFINITY) {
row {
primaryAction = activityAction
title = "Not a valid URI"
}
}
}
}
Kotlin
private fun postSomething(sliceUri: Uri): Slice {
return ListBuilder(context, postUri, ListBuilder.INFINITY)
.setHeader {
it.apply {
articleTitle = "GeeksforGeeks"
titleOfTheArticle = "geeksforgeeks.org"
summaryOfTheArticle = "A great Android article"
primaryAction = postArticle()
}
}
.build()
}
Kotlin
override fun postOnGeeksforGeeks(): Boolean {
return true
}
override fun onPostShared(sometShot: Uri): Slice? {
val path = sometShot.path
when (path) {
"/$ARTICLE_PATH" -> return createAPost(sometShot)
}
return null
}
通过单击此页面顶部或底部的下载材料按钮开始下载教程材料。启动 Android Studio 并添加基本项目。大多数情况下,您将设计自己的类。要添加代码,您需要找到 AndroidManifest.xml,因此请确保您可以找到它。如果您尚未下载适用于 Android API 级别 28 的 SDK,则需要这样做才能启动应用程序。如果您已经安装了 Android API 28,您可以跳过接下来的四个阶段,直接继续开发和启动应用程序。
切片查看器
要显示其材料,切片需要查看器或演示者。 Google 搜索应用是显示 Slice 模板的合适演示者之一。当用户在搜索字段中输入一个词时,您开发的 Slice 可能会显示与用户的搜索词组相关的信息。
例如,如果用户输入诸如“ride”或“ride vehicle”之类的术语,Careem 或 Uber 等已安装应用程序中的 Slices 可能会出现,从而允许用户无需打开相关应用程序即可订购汽车;可以使用应用操作和切片提供整个体验。
使用切片查看器显示您的切片
请注意,演示者可能会对您的 Slices 进行细微更改以满足他们的设计需求,例如字体样式、字体大小和/或颜色。例如,Slice 中的图标将使用演示者应用程序的强调色着色。
要从您的文章应用程序中显示切片,您需要一个切片查看器应用程序。 Slice Viewer 应用程序利用您的切片 Uri 在所谓的表面上查看它,并且在您的 Slice 的第一个请求时,将提示用户允许查看器访问。
使用 SliceProvider 类
SliceProvider 类是向其他应用程序公开您的 Slice 的唯一方法,它确定向查看器显示哪个 Slice。 SliceProvider 类扩展了 ContentProvider 类。 Android 应用程序的基本构建元素之一是内容提供程序。它们封装数据并通过 ContentResolver 接口将其交付给应用程序。如果您需要在应用程序之间传输数据,您可以使用内容提供程序。例如,联系人数据被众多应用程序使用,并保存在内容提供商中。单击此处了解有关内容供应商的更多信息。
在这种情况下,我们:
- 在启动时,使用 onCreateSliceProvider() 来初始化您的 Slice 提供程序。
- 如果您将长时间运行的进程放在这里,您的应用程序的启动将被延迟,与查看器绑定的第一个 Slice 也将延迟。
- 如果提供者成功加载,则返回 true;否则,返回false。
- 在 onBindSlice () 的主体内制作您的 Slice。
- 您应该尝试尽快生产并返回您的 Slice。
- 为了让您的 Slice UI 保持响应,请在后台进行网络查询或 I/O 活动。当您的后台活动完成后,联系 contentResolver 以使用新数据更新您的 Slice。
- 使用notifyChange(uri) 中的Slice URI,Android 将为您调用onBindSlice()。
- 路由可以从 URI 中获得。
- 如果该路径与 Slice 的路径匹配,则返回文章 Slice。
科特林
private fun postSomething(sliceUri: Uri): Slice {
return ListBuilder(context, postUri, ListBuilder.INFINITY)
.setHeader {
it.apply {
articleTitle = "GeeksforGeeks"
titleOfTheArticle = "geeksforgeeks.org"
summaryOfTheArticle = "A great Android article"
primaryAction = postArticle()
}
}
.build()
}
在撰写本文时,Android 有五个不同的 Slice 构建器,用于创建具有不同样式和功能的各种行:HeaderBuilder、RowBuilder、GridRowBuilder、RangeBuilder 和 InputRangeBuilder。
- 您将使用以下工具来构建您的“文章切片”设计:
- ListBuilder将成为 Slice 的主要构建器。
- HeaderBuilder用于创建带有标题和副标题的标题。
- GridRowBuilder用于创建一行单元格。
- 要添加单元格,请使用 CellBuilder;每个单元格包含一个图像、标题和文本
科特林
override fun postOnGeeksforGeeks(): Boolean {
return true
}
override fun onPostShared(sometShot: Uri): Slice? {
val path = sometShot.path
when (path) {
"/$ARTICLE_PATH" -> return createAPost(sometShot)
}
return null
}
启动切片查看器
- 从菜单中选择运行 -> 编辑配置。
- 点击左上角的+,然后选择Android App。
- 在名称字段中输入 Slice,在模块中输入 app。
- 在启动下,提供一个 URL,例如 slice-content:/com.app's-package name/gfg。
结论
也可以插入切片,类似于点击等交互,以显示吐司、记录或移动到新活动。现在,通过选择切片模块从右上角启动应用程序,您将看到应用程序的模块。