2.Android P新特性實踐-Slices

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模塊:

hello

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:

shortcut


??SMALL_IMAGE:small size and non-tintable:

small


??LARGE_IMAGE: largest size and non-tintable:

large


模塊構造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)更強大的功能。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,466評論 25 708
  • 作業(yè):好好思考一下,有沒有一個寫文章時可供征引闡的資源庫? 近來通過手機加了些自己覺得好的公眾號,看別人的...
    原本初心閱讀 281評論 2 1
  • 題目描述:給定一個整數(shù)數(shù)組,返回其中兩個數(shù)的下標,使它們的和等于指定的目標值。如: Given nums = [2...
    Nautilus1閱讀 218評論 0 0
  • 給那些相信平面設計除了宣揚商業(yè)價值之外,還具有文化和審美價值的設計師們 獻給那些相信只有當設計師是因為受到個人創(chuàng)造...
    汝藝閱讀 1,202評論 0 0
  • 1.感恩感謝我的身體每天帶給我覺知,讓我真正去愛自己!感恩感謝老師的授教,每天用老師教的手法給自己按摩,效果真心不...
    快樂豐盛的姝萱閱讀 226評論 0 1