Slices 在国内应用的范围不广,重要是因为Slices是 Google Assistant 的延伸,谷歌希望使用者能过快速到达App里面的某个特点功能,举一例子就是,你对Google Assistant说你要回家,那么以前可能只会出现滴滴,Uber的选项,但是引进Slices之后会显示更加详细的数据列表,比如滴滴item下会出现到家多少距离,多少钱,是否立即打车等等。Google Assistant 在国内不好用,但是谷歌有这个功能开源我们自己其实也可以去实现,可能小米会把这个功能给小艾同学吧。
Slice其实是一个UI展示模块,它可以在搜索APP、语音助手、关键字识别等动作中动态地显示你的APP部分模块的内容,通过它,可以丰富地显示你的APP当中的内容。Slice提供shortcut、small、large三种View显示模板,开发者可以根据自身APP需求选择合适的显示模板。
开始搭建我们的Slices吧。
注意注意:开发环境必须是Android Studio 3.2 以及以上,最低版本Android 4.4 (API level 19) ,我们可以从官网下载Android Studio 3.2 ,图标是黄色的,可以和我们之前的Android Studio 共存,相互没有干扰,讲实话Android Studio 3.2 真的处处是坑,特别和Kotlin配合,那真的是一言难尽,苦不堪言。
1.新建你的Android项目,在gradle中添加如下依赖:
implementation 'androidx.slice:slice-core:1.0.0-beta01'
implementation 'androidx.slice:slice-builders:1.0.0-beta01'
2.为你的APP创建Slice,你需要在你的项目文件中,点击右键选择New… > Other > Slice Provider,编辑器将会自动帮你在AndroidManifest.xml中添加Provider:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.app">
...
<application>
...
<provider
android:name=".provider.MySliceProvider"
android:authorities="com.xxx.xxxxxx.slicedemo.provider"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.app.slice.category.SLICE" />
<data
android:host="guanjianhui.teach.com"
android:pathPrefix="/hello"
android:scheme="http" />
</intent-filter>
</provider>
...
</application>
</manifest>
3.其中,SliceProvider继承于ContentProvider,其APP间数据的传递通过
ContentProvider的方式,应用APP向搜索APP对外提供其对应Slice的Uri,封装成Slice对象通过Parcelable序列化的方式实现APP之间的数据传递。新建类继承SliceProvider,并重写onBindSlice()方法,在该方法里可以编写Slice展示模块中的相关逻辑代码:
@Override
public Slice onBindSlice(Uri sliceUri) {
if (getContext() == null) {
return null;
}
SliceAction activityAction = createActivityAction();
ListBuilder listBuilder = new ListBuilder(getContext(), sliceUri, ListBuilder.INFINITY);
// Create parent ListBuilder.
if ("/hello".equals(sliceUri.getPath())) {
listBuilder.addRow(new ListBuilder.RowBuilder()
.setTitle("Hello World")
.setPrimaryAction(activityAction)
);
} else {
listBuilder.addRow(new ListBuilder.RowBuilder()
.setTitle("URI not recognized")
.setPrimaryAction(activityAction)
);
}
return listBuilder.build();
}
Uri的scheme统一为content,如上述例子的Uri为:
content://com.xxx.xxxxxx.slicedemo.provider/hello
4.跟notifications类似,你可以使用PendingIntents 来处理用户的点击事件,比如点击Slice模块打开宿主APP:
public Slice createSlice(Uri sliceUri) { if (getContext() == null) {
return null;
}
SliceAction activityAction = createActivityAction();
return new ListBuilder(getContext(), sliceUri, ListBuilder.INFINITY)
.addRow(new ListBuilder.RowBuilder()
.setTitle("Perform action in app.")
.setPrimaryAction(activityAction)
).build();
}
public SliceAction createActivityAction() {
if (getContext() == null) {
return null;
}
return SliceAction.create(
PendingIntent.getActivity(
getContext(),
0,
new Intent(getContext(), MainActivity.class),
0
),
IconCompat.createWithResource(getContext(), R.drawable.ic_home),
ListBuilder.ICON_IMAGE,
"Enter app"
);
}
5.通过开始安装的Slice Viewer ,搜索框中输入对应Slice的URI地址,便可在搜索APP中看到应用APP中添加的Slice模块:
hello
Slice模板
ListBuilder
Slices通过ListBuilder类来创建。在ListBuilder中,你可以添加不同类型的行模块在你的Slice中进行展示。
SliceAction
Slice模板的最基本元素是 SliceAction。SliceAction包含一个标签以及一个PendingIntent, 并且是以下之一:
图标按钮
默认切换
自定义切换(具有开/关状态的可绘图)
对于每一个Slice来说,最基础的构造实现类是SliceAction,在SliceAction你可以添加PendingIntent来实现用户操作,比如Toggle选择操作:
SliceAction toggleAction =SliceAction.createToggle(createToggleIntent(),"Toggle adaptive brightness",true);
SliceAction可以配置在搜索APP中显示的模块三种不同的显示方式:
ICON_IMAGE:tiny size and tintable:
shortcut
SMALL_IMAGE:small size and non-tintable:
small
LARGE_IMAGE: largest size and non-tintable:
large
模块构造Builder
对于每个Slice模块的创建构造,谷歌官方提供了HeaderBuilder、RowBuilder、GridBuilder、RangeBuilder模块四种构造器。其中,HeaderBuilder只支持一行头部的展示view;RowBuilder可以添加一行view进行展示,如此前没有添加header,则首行row默认为header;GridBuilder支持上述所说的三种模块展示方式;而RangeBuilder则支持进度条相关的view展示。
在大多数情况下,您应该使用HeaderBuilder为您的模板设置标题 。标头可以支持以下内容:
标题
字幕
摘要字幕
主要行动
延时加载
对于一些需要耗时加载数据的操作,比如网络请求图片等,可以采取与ListView加载图片类似的方法,先本地加载一个默认的占位数据,等耗时操作完成回调回来真实数据的时候调用getContentResolver().notifyChange(sliceUri) 方法,通知搜索APP调用Slice Uri,完成真实数据的显示。
结语
Slice的功能模板非常的强大,通过不同的builder组合可以在搜索模块中搭配出丰富多彩的Slice,快速直达用户想要的功能。但是Slice只提供了三种模板,自带模板中对安卓原生控件的支持有所欠缺,比如ScollView等,可能需要用户自定义自己的模板才能实现更强大的功能。
喜欢 就关注吧,欢迎投稿!
本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/slices代替wedigt,你会用了吗?/