Android 7.1 新特性之 Shortcuts 介紹
Android 7.1 允許 App 自定義 Shortcuts,類似 iOS 的 3D touch。通過(guò)在桌面長(zhǎng)按 App 彈出 Shortcut 列表,點(diǎn)擊某個(gè) Shortcut 快速進(jìn)入某項(xiàng)操作,同時(shí) Shortcut 可以拖動(dòng)到桌面進(jìn)行固定,如下圖系統(tǒng)日歷 App:
由于 7.1 SDK 的 Sources 尚未開(kāi)放,目前大部分內(nèi)容還是根據(jù)官方 API 文檔而來(lái),還有些細(xì)節(jié)和可能的 Bug 還得等 Sources 開(kāi)放。
Shortcuts 全面介紹分為兩篇,本文是基礎(chǔ)介紹,關(guān)于 Shortcuts 一些不錯(cuò)的實(shí)踐和目前的問(wèn)題可訪問(wèn) trinea.cn ***文章。
1. Shortcuts 作用及分類
Shortcuts 為 App 常用操作提供了快速訪問(wèn)的方式,如上面日歷的新建提醒。 這個(gè)功能目前只能在 Android 7.1 系統(tǒng)桌面進(jìn)行使用,這個(gè)依然保留著“應(yīng)用抽屜”古老設(shè)計(jì)的產(chǎn)品國(guó)內(nèi)應(yīng)該沒(méi)多少用戶。三方桌面可以通過(guò) API 接入這個(gè)功能。
目前支持 Shortcut 的應(yīng)用主要還是 Google 的 App,看到有即刻的朋友說(shuō)他們?cè)?7.1 系統(tǒng)發(fā)布時(shí)快速支持了這個(gè)功能并上線,速度很贊。
類似 BroadcastReceiver 可通過(guò)靜態(tài)和動(dòng)態(tài)方式注冊(cè),Shortcuts 也可以通過(guò)靜態(tài)和動(dòng)態(tài)方式添加。
2. 靜態(tài) Shortcuts(Static Shortcuts)
靜態(tài) ShortcutsStatic Shortcuts 通過(guò)在 Manifest 中聲明添加。缺點(diǎn)是不可以修改,只能通過(guò)應(yīng)用升級(jí)來(lái)添加新的靜態(tài) Shortcuts。添加主要分為兩步:
(1)AndroidManifest 的 Main Launcher 對(duì)應(yīng)的 Activity 內(nèi)添加 meta-datameta-data name 為 android.app.shortcuts,如下:
必須在 Main Launcher 對(duì)應(yīng)的 Activity 內(nèi)設(shè)置,其中 android:resource 指向定義了 shortcuts 的資源文件。
(2)資源文件中定義具體的 shortcutsres 目錄下新建 xml 文件夾,并新建 shortcuts.xml 文件,內(nèi)容如下:
以 shortcuts 元素為根,可以包含多個(gè) shortcut 元素,每個(gè) shortcut 元素表示一個(gè) shortcut。其中屬性分別表示:
(1) shortcutId 表示 shortcut 唯一標(biāo)識(shí)符,相同的 shortcutId 會(huì)被覆蓋。必須字段。
(2) shortcutShortLabel 為將 shortcut 拖動(dòng)到桌面時(shí)顯示的名字,官方建議不超過(guò) 10 個(gè)字符,必須字段。
(3) shortcutLongLabel 為 shortcut 列表中每個(gè) shortcut 的名字,不宜過(guò)長(zhǎng),如果過(guò)長(zhǎng)或未設(shè)置默認(rèn)會(huì)顯示 ShortLabel,官方建議不超過(guò) 25 個(gè)字符。可選字段。
(4) icon 為 shortcut 的 icon,在列表展示和拖動(dòng)到桌面時(shí)顯示需要,可選字段。
(5) enabled 表示 shortcut 是否可用,false 表示禁用。xml 中這個(gè)屬性幾乎沒(méi)有被設(shè)置為 false 的實(shí)際場(chǎng)景,具體原因可見(jiàn) 6.7 如何更好的刪除(廢棄)老的 Shortcut中介紹。
(6) shortcutDisabledMessage 為已固定在桌面的 shortcut 被 Disabled 后點(diǎn)擊時(shí)的 Toast 提示內(nèi)容。可選字段。
(7) intent 為點(diǎn)擊 shortcut 時(shí)響應(yīng)的 intent,必須字段。
這里可以添加多個(gè) intent,但點(diǎn)擊時(shí)不會(huì)啟動(dòng)所有 intent,而是啟動(dòng)***一個(gè) intent,在這個(gè) intent 回退時(shí)會(huì)啟動(dòng)它前面一個(gè) intent,相當(dāng)于自動(dòng)將所有 intent 添加到了堆棧。
intent 可設(shè)置屬性包括:
android:action、android:data、android:mimeType、android:targetClass、android:targetPackage,其中 android:action 為必須屬性。
3. 動(dòng)態(tài) Shortcuts(Dynamic Shortcuts)
動(dòng)態(tài) ShortcutsDynamic Shortcuts 通過(guò) ShortcutManager API 進(jìn)行操作。可以動(dòng)態(tài)添加、修改、刪除。
通過(guò) ShortcutInfo.Builder 新建 ShortcutInfo,再通過(guò) shortcutManager 添加即可。其他:
(1) setDynamicShortcuts(List) 可以替換并添加所有 shortcut 列表;
(2) addDynamicShortcuts(List) 可以添加新的 shortcut 到列表,超過(guò)***個(gè)數(shù)會(huì)報(bào)異常;
(3) updateShortcuts(List) 可以更新一組 shortcuts;
(4) removeDynamicShortcuts(List) 和 removeAllDynamicShortcuts() 可以刪除部分或所有 shortcuts。
ShortcutInfo 的屬性與 xml 中定義字段含義一致,shortcutId shortcutShortLabel intent 是必須設(shè)置的字段,并且 intent 必須設(shè)置 Action。
4. 固定的 Shortcuts(Pinned Shortcuts)
指通過(guò)拖動(dòng)固定到桌面的 Shortcuts,App 不可以添加、修改、刪除這些 Shortcuts,只能禁用他們。即便 App 內(nèi)刪除了某個(gè) Shorcut,對(duì)應(yīng)的已固定到桌面的 Shortcuts 也不會(huì)被刪除。
可以通過(guò):
(1) getPinnedShortcuts() 得到所有固定的 Shortcuts 的信息。
(2) disableShortcuts(List) 或 disableShortcuts(List, CharSequence) 禁用動(dòng)態(tài)的 Shortcuts。
對(duì)于靜態(tài)的 Shortcuts 需要在資源文件中設(shè)置 android:enabled="false" 進(jìn)行禁用,不過(guò)沒(méi)有必要,靜態(tài) Shortcuts 可直接通過(guò)刪除達(dá)到禁用的效果,具體原因可見(jiàn) 6.7 如何更好的刪除(廢棄)老的 Shortcut 中介紹。
靜態(tài) Shortcuts 和動(dòng)態(tài) Shortcuts 是有***個(gè)數(shù)限制的,默認(rèn)為 5,超過(guò)***個(gè)數(shù)后添加會(huì)報(bào)異常。而固定的 Shortcuts 并沒(méi)有個(gè)數(shù)限制,并且固定的 Shortcut 對(duì)應(yīng)的 Shortcut 即便被動(dòng)態(tài)刪除了,依然可以通過(guò) id 進(jìn)行 Update 操作。
5. 其他
5.1 動(dòng)態(tài) Shortcuts 與靜態(tài) Shortcuts 區(qū)別
(1) 靜態(tài) Shortcuts 只能通過(guò)升級(jí)應(yīng)用修改,動(dòng)態(tài) Shortcuts 隨時(shí)可以修改;
(2) 靜態(tài) Shortcuts 的 Intent 無(wú)法設(shè)置 Flag,默認(rèn)為 FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TASK Flag,即若應(yīng)用運(yùn)行中會(huì)清除所有已存在的 Activity。動(dòng)態(tài) Shortcuts 的 Intent 可以設(shè)置 Flag;
(3) 靜態(tài) Shortcuts 的 rank 系統(tǒng)默認(rèn)根據(jù)聲明順序設(shè)置,動(dòng)態(tài) Shortcuts 的 rank 可以通過(guò) setRank(int rank) 接口主動(dòng)設(shè)置,rank 不能小于 0,值越大表示在 shortcut 列表展示時(shí)離 App Icon 越遠(yuǎn)。靜態(tài) Shortcuts 默認(rèn)比動(dòng)態(tài) Shortcuts 離 App Icon 更近。
(4) 靜態(tài) Shortcuts 刪除可以直接刪除,動(dòng)態(tài) Shortcuts 建議通過(guò)禁用刪除;
5.2 動(dòng)態(tài) Shortcuts 操作的頻率問(wèn)題
當(dāng)應(yīng)該完全退到后臺(tái)(無(wú) Activity 或 Service 在前臺(tái)時(shí)),其操作 Shortcut(包括添加、刪除、修改) 的頻率是受限的。可通過(guò) isRateLimitingActive() 查詢是否已受限,true 表示已受限。
5.3 跟蹤 Shorcut 使用情況
在 Shortcut 被選擇或者其關(guān)聯(lián)的操作被操作時(shí)需調(diào)用 reportShortcutUsed(String shortcutId) 接口上報(bào)數(shù)據(jù),為了方便啟動(dòng)器收集應(yīng)用 Shortcuts 使用情況,可能未來(lái)進(jìn)行預(yù)測(cè)或者向開(kāi)發(fā)者展示哪些操作適合作為 Shortcuts 以及其優(yōu)先級(jí)。
PS:這個(gè)接口其實(shí)挺尷尬的,一方面需要 App 主動(dòng)上報(bào),侵入性太強(qiáng)。另一方面這個(gè)預(yù)測(cè)功能未來(lái)也不好加到 Shortcuts 推薦里,更多是個(gè)開(kāi)發(fā)工具相關(guān)功能。
***是由啟動(dòng)器自己純粹收集 Shortcut 被選擇的使用情況數(shù)據(jù),而不需要統(tǒng)計(jì) Shortcut 被關(guān)聯(lián)操作通過(guò)其他方式調(diào)用的使用情況數(shù)據(jù)。至于哪些操作適合作為 Shortcuts,開(kāi)發(fā)者大可通過(guò)其他監(jiān)控 SDK 去判斷。
【本文是51CTO專欄作者Trinea的原創(chuàng)文章,轉(zhuǎn)載聯(lián)系作者本人獲取授權(quán)】
























