2.Android P新特性實踐-Slices

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

hello

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:

shortcut


??SMALL_IMAGE:small size and non-tintable:

small


??LARGE_IMAGE: largest size and non-tintable:

large


模塊構(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)大的功能色难。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市等缀,隨后出現(xiàn)的幾起案子枷莉,更是在濱河造成了極大的恐慌,老刑警劉巖项滑,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涯贞,居然都是意外死亡枪狂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門宋渔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來州疾,“玉大人,你說我怎么就攤上這事皇拣⊙媳停” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵氧急,是天一觀的道長颗胡。 經(jīng)常有香客問我,道長吩坝,這世上最難降的妖魔是什么毒姨? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮钉寝,結(jié)果婚禮上弧呐,老公的妹妹穿的比我還像新娘。我一直安慰自己嵌纲,他們只是感情好俘枫,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逮走,像睡著了一般鸠蚪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上师溅,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天邓嘹,我揣著相機(jī)與錄音,去河邊找鬼险胰。 笑死汹押,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的起便。 我是一名探鬼主播棚贾,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼窖维,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妙痹?” 一聲冷哼從身側(cè)響起铸史,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怯伊,沒想到半個月后琳轿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡耿芹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年崭篡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吧秕。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡琉闪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砸彬,到底是詐尸還是另有隱情颠毙,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布砂碉,位于F島的核電站蛀蜜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏增蹭。R本人自食惡果不足惜涵防,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沪铭。 院中可真熱鬧壮池,春花似錦、人聲如沸杀怠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赔退。三九已至橙依,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間硕旗,已是汗流浹背窗骑。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留漆枚,地道東北人创译。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像墙基,于是被迫代替她去往敵國和親软族。 傳聞我的和親對象是個殘疾皇子刷喜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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

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