Android P新特性實踐-Slices
概述
??在2018年谷歌I/O開發(fā)者大會上,谷歌發(fā)布了萬眾期待的Android最新版本-Android P。Slice作為Android P版本更新的一大功能,其使用場景以及新API的使用也格外引人注目。
??Slice其實是一個UI展示模塊,它可以在搜索APP、語音助手、關鍵字識別等動作中動態(tài)地顯示你的APP部分模塊的內(nèi)容,通過它,可以豐富地顯示你的APP當中的內(nèi)容。Slice提供shortcut、small、large三種View顯示模板,開發(fā)者可以根據(jù)自身APP需求選擇合適的顯示模板。
開始使用
Tips
1.在開始使用之前,你需要更新最新版本的Android Studio,到目前我使用的最新版本為 Android Studio 3.3 Canary 3 。以便支持最新的Android擴展插件,AndroidX。
2.下載安裝谷歌官方提供的Slice模塊搜索測試工具,[Slice Viewer sample](Slice Viewer ) ,僅支持安卓4.4以上的手機調(diào)試使用。
??1.新建你的Android項目,在gradle中添加如下依賴:
implementation 'androidx.slice:slice-core:1.0.0-beta01'
implementation 'androidx.slice:slice-builders:1.0.0-beta01'
??2.為你的APP創(chuàng)建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間數(shù)據(jù)的傳遞通過
ContentProvider的方式,應用APP向搜索APP對外提供其對應Slice的Uri,封裝成Slice對象通過Parcelable序列化的方式實現(xiàn)APP之間的數(shù)據(jù)傳遞。新建類繼承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統(tǒng)一為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模塊:
Slice模板
ListBuilder
??Slices通過ListBuilder類來創(chuàng)建。在ListBuilder中,你可以添加不同類型的行模塊在你的Slice中進行展示。
SliceAction
??對于每一個Slice來說,最基礎的構造實現(xiàn)類是SliceAction,在SliceAction你可以添加PendingIntent來實現(xiàn)用戶操作,比如Toggle選擇操作:
SliceAction toggleAction =SliceAction.createToggle(createToggleIntent(),"Toggle adaptive brightness",true);
SliceAction可以配置在搜索APP中顯示的模塊三種不同的顯示方式:
??ICON_IMAGE:tiny size and tintable:
??SMALL_IMAGE:small size and non-tintable:
??LARGE_IMAGE: largest size and non-tintable:
模塊構造Builder
??對于每個Slice模塊的創(chuàng)建構造,谷歌官方提供了HeaderBuilder、RowBuilder、GridBuilder、RangeBuilder模塊四種構造器。其中,HeaderBuilder只支持一行頭部的展示view;RowBuilder可以添加一行view進行展示,如此前沒有添加header,則首行row默認為header;GridBuilder支持上述所說的三種模塊展示方式;而RangeBuilder則支持進度條相關的view展示。
延時加載
??對于一些需要耗時加載數(shù)據(jù)的操作,比如網(wǎng)絡請求圖片等,可以采取與ListView加載圖片類似的方法,先本地加載一個默認的占位數(shù)據(jù),等耗時操作完成回調(diào)回來真實數(shù)據(jù)的時候調(diào)用getContentResolver().notifyChange(sliceUri) 方法,通知搜索APP調(diào)用Slice Uri,完成真實數(shù)據(jù)的顯示。
結語
??Slice的功能模板非常的強大,通過不同的builder組合可以在搜索模塊中搭配出豐富多彩的Slice,快速直達用戶想要的功能。但是Slice只提供了三種模板,自帶模板中對安卓原生控件的支持有所欠缺,比如ScollView等,可能需要用戶自定義自己的模板才能實現(xiàn)更強大的功能。