Android P新特性實踐-Slices
概述
??在2018年谷歌I/O開發(fā)者大會上捷绑,谷歌發(fā)布了萬眾期待的Android最新版本-Android P柑爸。Slice作為Android P版本更新的一大功能,其使用場景以及新API的使用也格外引人注目霎箍。
??Slice其實是一個UI展示模塊隙笆,它可以在搜索APP碘赖、語音助手、關(guān)鍵字識別等動作中動態(tài)地顯示你的APP部分模塊的內(nèi)容轻猖,通過它帆吻,可以豐富地顯示你的APP當(dāng)中的內(nèi)容。Slice提供shortcut咙边、small猜煮、large三種View顯示模板,開發(fā)者可以根據(jù)自身APP需求選擇合適的顯示模板。
開始使用
Tips
1.在開始使用之前败许,你需要更新最新版本的Android Studio友瘤,到目前我使用的最新版本為 Android Studio 3.3 Canary 3 。以便支持最新的Android擴(kuò)展插件檐束,AndroidX辫秧。
2.下載安裝谷歌官方提供的Slice模塊搜索測試工具,[Slice Viewer sample](Slice Viewer ) 被丧,僅支持安卓4.4以上的手機(jī)調(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的方式婶肩,應(yīng)用APP向搜索APP對外提供其對應(yīng)Slice的Uri,封裝成Slice對象通過Parcelable序列化的方式實現(xiàn)APP之間的數(shù)據(jù)傳遞貌夕。新建類繼承SliceProvider律歼,并重寫onBindSlice()方法,在該方法里可以編寫Slice展示模塊中的相關(guān)邏輯代碼:
@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 ,搜索框中輸入對應(yīng)Slice的URI地址们童,便可在搜索APP中看到應(yīng)用APP中添加的Slice模塊:
Slice模板
ListBuilder
??Slices通過ListBuilder類來創(chuàng)建畔况。在ListBuilder中,你可以添加不同類型的行模塊在你的Slice中進(jìn)行展示慧库。
SliceAction
??對于每一個Slice來說跷跪,最基礎(chǔ)的構(gòu)造實現(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:
模塊構(gòu)造Builder
??對于每個Slice模塊的創(chuàng)建構(gòu)造域庇,谷歌官方提供了HeaderBuilder、RowBuilder覆积、GridBuilder听皿、RangeBuilder模塊四種構(gòu)造器。其中宽档,HeaderBuilder只支持一行頭部的展示view尉姨;RowBuilder可以添加一行view進(jìn)行展示,如此前沒有添加header吗冤,則首行row默認(rèn)為header又厉;GridBuilder支持上述所說的三種模塊展示方式;而RangeBuilder則支持進(jìn)度條相關(guān)的view展示椎瘟。
延時加載
??對于一些需要耗時加載數(shù)據(jù)的操作覆致,比如網(wǎng)絡(luò)請求圖片等,可以采取與ListView加載圖片類似的方法肺蔚,先本地加載一個默認(rèn)的占位數(shù)據(jù)煌妈,等耗時操作完成回調(diào)回來真實數(shù)據(jù)的時候調(diào)用getContentResolver().notifyChange(sliceUri) 方法,通知搜索APP調(diào)用Slice Uri宣羊,完成真實數(shù)據(jù)的顯示璧诵。
結(jié)語
??Slice的功能模板非常的強(qiáng)大,通過不同的builder組合可以在搜索模塊中搭配出豐富多彩的Slice仇冯,快速直達(dá)用戶想要的功能之宿。但是Slice只提供了三種模板,自帶模板中對安卓原生控件的支持有所欠缺苛坚,比如ScollView等比被,可能需要用戶自定義自己的模板才能實現(xiàn)更強(qiáng)大的功能色难。