艰苦的工作并不仅仅是因为您的应用在Google Play商店中获得了大量下载和正面评价。 典型的移动用户在其设备上安装了数十个应用程序,并且随着新应用程序的不断发布,您将需要努力保持观众的兴趣!
保持用户回到您的应用程序对于建立稳定,忠实的用户群至关重要 。 另外,如果您已经通过应用获利,那么人们在应用中花费的时间会直接影响您的收入-可以将每一秒钟视为展示广告或诱使用户大肆宣传的另一次机会。 -app购买!
Google在今年的I / O大会上推出了slices这一新功能,该功能有望在最需要的确切时间将用户的应用程序功能和内容显示在用户面前,从而带动用户回到您的应用程序。
切片成形是保留您的观众的重要工具,现在正是使用这一崭新的Android功能获得动手经验的最佳时机。 到本文结尾,您将创建一系列切片,从一个可以在点击时启动Activity的简单切片到由图标,图像,网格和多个SliceActions
组成的更复杂的切片。
Slices:用户享受您的应用程序的更多方式
与窗口小部件类似,切片是出现在应用程序上下文之外的内容片段,从而增加了应用程序的可见性并为您提供了更多吸引观众的机会。
切片有可能极大地提高您应用的可见性,而Google承诺会在许多Android用户花费大量时间的区域(包括Google搜索和Google助手)中增加对切片的支持。 由于它们是Android Jetpack的一部分,因此分片与Android 4.4及更高版本兼容,这意味着您的分片有可能覆盖所有Android用户的95%。
因此,切片可以提供很多功能-但是它们如何工作?
当前,如果您在Google应用中执行搜索,则Google可能会建议您设备上已安装的相关应用。 例如,如果您已经安装了Facebook for Mobile,则键入facebook将打开直接链接到Facebook应用程序的链接。
Slice通过关注用户可能希望在其已安装的应用程序中执行的特定任务,使此应用程序进一步链接了一步。
让我们看一个例子:假设您已经安装了“预订旅馆”应用,该应用可让您搜索旅馆并预订房间。 当您将伦敦的旅馆输入Google时,会遇到通常的搜索结果,以及“预订旅馆”应用程序的一部分。 该分片推荐伦敦的一家酒店,并以按钮的形式显示诸如酒店名称和地址之类的信息以及 SliceAction
,您可以直接从该分片的用户界面(UI)预订房间。
对于用户而言,此片提供了在特定时刻轻松访问他们所需的信息和功能的信息。 对于开发人员而言,这片片刻使他们能够在他们重新获得成功的最大机会的确切时刻,将应用程序展示在用户面前。
如何创建我的第一个切片?
让我们从创建一个简单的切片开始,点击该切片将启动应用程序的MainActivity
。
这种简单的技术可以直接从切片的UI启动任何任务。 在我们的“预订旅馆”示例中,我们可以仅将按钮链接到相关应用程序的BookRoomActivity
,这将是减少用户完成此特定任务所必须浏览的屏幕数的简单但有效的方法。
首先,创建一个新的Android项目。 您可以使用任何所需的设置,但是请确保在出现提示时选中包括Kotlin支持复选框。
创建项目后,打开其build.gradle文件并添加slice-core
和slice-builder
依赖项:
dependencies {
implementation 'androidx.appcompat:appcompat:1.0.0-alpha3'
implementation 'androidx.slice:slice-core:1.0.0-alpha3'
implementation 'androidx.slice:slice-builders:1.0.0-alpha3'
implementation 'androidx.constraintlayout:constraintlayout:1.1.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
使用分片提供商在Google搜索中显示您的应用内容
接下来,我们需要创建一个slice provider ,它是负责在应用程序上下文之外显示应用程序内容的组件。
您可以使用Android Studio的分片提供程序模板创建分片提供程序:
- 从Android Studio工具栏中选择新建 > 其他 > 切片提供程序 。
- 输入名称MySliceProvider 。
- 将源语言设置为Kotlin 。
- 点击完成 。
- 打开
MySliceProvider
类,您应该看到以下自动生成的代码:
import android.content.ContentResolver
import android.content.Intent
import android.net.Uri
import androidx.slice.Slice
import androidx.slice.SliceProvider
import androidx.slice.builders.ListBuilder
class MySliceProvider : SliceProvider() {
override fun onCreateSliceProvider(): Boolean {
return true
}
override fun onMapIntentToUri(intent: Intent?): Uri {
var uriBuilder: Uri.Builder = Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
if (intent == null) return uriBuilder.build()
val data = intent.data
if (data != null && data.path != null) {
val path = data.path.replace("/", "")
uriBuilder = uriBuilder.path(path)
}
val context = context
if (context != null) {
uriBuilder = uriBuilder.authority(context.getPackageName())
}
return uriBuilder.build()
}
//Construct the slice//
override fun onBindSlice(sliceUri: Uri): Slice? {
val context = getContext() ?: return null
return if (sliceUri.path == "/") {
//Customise the Slice//
ListBuilder(context, sliceUri)
.addRow { it.setTitle("URI found.") }
.build()
} else {
ListBuilder(context, sliceUri)
.addRow { it.setTitle("URI not found.") }
.build()
}
}
//Subscribe to a data source, if necessary//
override fun onSlicePinned(sliceUri: Uri?) {
}
//Avoid memory leaks by unsubscribing from the data source and removing any observers//
override fun onSliceUnpinned(sliceUri: Uri?) {
}
}
如果您使用新建 > 其他 > 切片提供者创建切片提供者 ,那么Android Studio还将在您的清单中添加必要的提供者:
<provider
android:name=".MySliceProvider"
android:authorities="com.jessicathornsby.kotlinslices"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.app.slice.category.SLICE" />
<data
android:host="jessicathornsby.com"
android:pathPrefix="/"
android:scheme="http" />
</intent-filter>
</provider>
</application>
此项确保您的切片可以被其他应用程序发现。
您的Gradle项目同步失败了吗?
到目前为止,我们仅使用了Android Studio自动生成的代码,但是您的项目可能已经拒绝编译!
错误,缺少功能和全面的奇怪行为只是使用早期版本的乐趣的一部分。 在撰写本文时,生成分片提供程序有时会莫名其妙地将一组新的依赖项添加到项目的build.gradle文件中。
implementation 'androidx.slice:slices-core:1.0.0-alpha1'
implementation 'androidx.slice:slices-builders:1.0.0-alpha1'
这些依赖不仅是不必要的,而且是错误的。 尽管很容易错过,但是比较一下: