開篇
Shortcuts
功能跟隨著 Android7.1 Nougat 一起誕生蜡歹,其主要目在于用戶可以定義一些常用的操作路徑,以快捷方式的形式存在鳖宾,這些快捷方式展示在可以支持的設(shè)備上掀亩,幫助用戶快速啟動常用或者推薦的頁面和行為卢鹦。
最近也是有 Shortcut 相關(guān)的需求需要開發(fā)悄泥,特此進行了總結(jié)虏冻,希望可以幫助到大家。ShortcutsDemo
概覽
快捷方式一般是以兩種方式存在:
一種通過 長按 應(yīng)用 icon弹囚,此時會彈出列表彈窗厨相,里面展示需要操作的路徑,對于沒有配置快捷方式的應(yīng)用鸥鹉,一般只會展示分享或者應(yīng)用信息的入口(不同手機可能展示不一樣)蛮穿。如果該應(yīng)用配置了快捷方式,那么在列表中則會展示對應(yīng)的快捷方式入口毁渗。
如上圖所示践磅,配置和沒有配置快捷方式的區(qū)別就在于,列表中是否配置自定義的快捷方式入口灸异。
另一種則以桌面快捷方式的形式存在府适,同一種行為可以存在多個相同的桌面快捷方式幻碱。
如上圖,對于 Chrome-打開新的標(biāo)簽頁 這種行為可以有多個相同的桌面快捷方式细溅。
Shortcuts 類型
每個快捷方式都可以攜帶一個或多個 intent,當(dāng)用戶點擊快捷方式時儡嘶,每個 intent 都會觸發(fā)應(yīng)用中對應(yīng)的操作喇聊,一般快捷方式的創(chuàng)建類型取決于你具體快捷方式存在的形態(tài)和你想賦予他什么樣的行為”目瘢可以以下面的例子作為參考:
- 在天氣應(yīng)用中誓篱,想查看最近幾天天氣的趨勢
- 在電子郵件應(yīng)用中,想創(chuàng)建新的電子郵件
- 在地圖應(yīng)用中凯楔,定位一個具體的位置
- 在聊天應(yīng)用中窜骄,向指定好友發(fā)送信息
- 在媒體應(yīng)用中,播放電視節(jié)目的下一集
- 在游戲應(yīng)用中摆屯,加載游戲最后一個保存的時間點
... ...
你可以為你的應(yīng)用發(fā)布以下類型的快捷方式‘
- 靜態(tài)的快捷方式: 其直接會打包到 apk 或 apk bundle 中邻遏,安裝完應(yīng)用便存在快捷方式入口。
- 動態(tài)的快捷方式: 只有在應(yīng)用運行時才會創(chuàng)建虐骑,可以隨時的更新准验、添加和刪除對應(yīng)的快捷方式。
- 桌面快捷方式: 必須在用戶授權(quán)的情況下廷没,可以主動的添加快捷方式到桌面糊饱,同樣可以拷貝動態(tài)和靜態(tài)的快捷方式到桌面。
Shortcuts 限制條件
雖然對于一個應(yīng)用程序一般可以創(chuàng)建五個快捷方式颠黎,其中包括靜態(tài)和動態(tài)的另锋,但是但多數(shù)的設(shè)備上只能展示 四個。
但是桌面快捷方式是不做限制的狭归,不過桌面快捷方式非用戶主動刪除的話夭坪,是沒法移除的,只能通過禁用的方式讓該桌面快捷方式失效过椎。
使用
快捷方式可以幫助用戶快速訪問常用的路徑和頁面台舱,從而為用戶提供特定類型的內(nèi)容。代碼以上傳至 ShortcutsDemo
Shortcuts 類型選擇
那該如何選擇快捷方式類型潭流,這取決你的快捷方式是應(yīng)用驅(qū)動還是用戶驅(qū)動竞惋。雖然靜態(tài)快捷方式意圖不可更改,動態(tài)的可更改灰嫉,但是這兩種都是屬于應(yīng)用驅(qū)動拆宛。如果用戶想自定義想要的意圖,通過桌面快捷方式形式的展現(xiàn)讼撒,那這就是用戶驅(qū)動浑厚。
怎么理解呢股耽?用簡書作為例子進行講解:
-
靜態(tài)快捷方式: 這種最適合那種在整個程序的生命周期中,意圖不會改變,始完成整同一種行為钳幅。鑒于程序一般只能顯示四個快捷方式物蝙,那靜態(tài)的快捷方式一般對于那種比較常見的行為非常有用和有必要。
例如上圖簡書中敢艰,像「搜索」入口就比較常見诬乞,不需要傳遞參數(shù)或傳遞的參數(shù)不會改變,那這種就建議使用靜態(tài)快捷方式钠导。
-
動態(tài)快捷方式: 這種一般對意圖較為敏感的操作震嫉。意圖可能在應(yīng)用運行中發(fā)生改變,需要更新快捷方式牡属。
例如簡書入口中的 「我的公開文章」票堵,因為多賬號的原因,可能切換賬號逮栅,那跳轉(zhuǎn)的頁面所攜帶的參數(shù)就會改變悴势,快捷方式就需要更新,這種就需要使用靜態(tài)快捷方式措伐。
-
桌面快捷方式: 這種允許用戶自定義跳轉(zhuǎn)意圖瞳浦。
例如簡書支持將關(guān)注的人創(chuàng)建快捷方式到桌面,下次直接可以訪問該人的動態(tài)信息废士,這種完全是用戶自發(fā)的創(chuàng)建叫潦,所以使用桌面快捷方式。
Shortcuts 類型創(chuàng)建
有了上述類型的具體描述官硝,下面針對這三種快捷方式的創(chuàng)建進行例子介紹矗蕊。
創(chuàng)建靜態(tài)快捷方式
靜態(tài)快捷方式提供應(yīng)用程序內(nèi)的通用跳轉(zhuǎn),這些一般在整個程序的生命周期內(nèi)是保持不變的氢架。
通過以下步驟完成靜態(tài)快捷方式的創(chuàng)建:
在
AndroidManifest.xml
中找到配置android.intent.action.MAIN
和android.intent.category.LAUNCHER
的Activity
傻咖。-
添加
<meta-data>
元素到 Activity 中<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" /> </activity>
-
創(chuàng)建新的資源文件:
res/xml/shortcuts.xml
<?xml version="1.0" encoding="utf-8"?> <shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <shortcut android:enabled="true" android:icon="@drawable/add" android:shortcutDisabledMessage="@string/static_disabled_message" android:shortcutId="staticId" android:shortcutLongLabel="@string/static_shortcut_long_label" android:shortcutShortLabel="@string/static_shortcut_short_label"> <intent android:action="android.intent.action.VIEW" android:data="content://xiaweizi.com/fromStaticShortcut" android:targetClass="com.example.xiaweizi.shortcutsdemo.TestActivity" android:targetPackage="com.example.xiaweizi.shortcutsdemo" /> <categories android:name="android.shortcut.conversation" /> </shortcut> </shortcuts>
具體參數(shù)配置說明如下:
標(biāo)簽名稱 | 描述 |
---|---|
android:shortcutId | shortcut 的唯一標(biāo)識,更新刪除都需要他最為關(guān)鍵字 |
android:shortcutShortLabel | 描述快捷方式的簡明短語岖研,如果可能盡可能控制為 10 個字符 |
android:shortcutLongLabel | 描述快捷方式的擴展短語卿操,如果空間足夠會顯示此值,盡可能控制在 25 個字符 |
android:shortcutDisabledMessage | 如果桌面快捷方式被禁用孙援,點擊會彈出此提示內(nèi)容 |
android:enabled | 控制桌面快捷方式是否被禁用 |
android:icon | 快捷方式旁邊的圖標(biāo) |
android:action | intent 跳轉(zhuǎn)的 action |
android:targetPackage | 跳轉(zhuǎn)頁面的包名 |
android:targetClass | 跳轉(zhuǎn)頁面的完整路徑 |
-
如果有數(shù)據(jù)的傳遞害淤,要有對應(yīng)的解析
if (getIntent().getData() != null && TextUtils.equals(getIntent().getAction(), Intent.ACTION_VIEW)) { Uri uri = getIntent().getData(); List<String> pathSegments = uri.getPathSegments(); if (pathSegments != null && pathSegments.size() > 0) { tvTest.setText(pathSegments.get(0)); } }
最終的運行效果:
創(chuàng)建動態(tài)快捷方式
動態(tài)快捷方式提供向指向應(yīng)用內(nèi)特定的跳轉(zhuǎn)或數(shù)據(jù)傳遞,這些跳轉(zhuǎn)和數(shù)據(jù)可能會在應(yīng)用執(zhí)行中發(fā)生變化拓售。
此時需要借助 ShortcutManager
提供的 API 來完成動態(tài)快捷方式的相應(yīng)操作:
-
創(chuàng)建: 使用
setDynamicShortcuts()
重新定義動態(tài)快捷方式的完整列表 -
添加: 使用
addDynamicShortcut()
來擴充現(xiàn)有的動態(tài)快捷方式列表 -
更新: 使用
updateShortcuts()
方法進行更新現(xiàn)有的動態(tài)快捷方式列表 -
刪除: 使用
removeDynamicShortcuts()
移除一組動態(tài)快捷方式窥摄,或者使用removeAllDynamicShortcuts()
移除所有動態(tài)快捷方式
以創(chuàng)建為例,其他差不多础淤,自行嘗試崭放,具體的操作可參考下面的代碼:
-
創(chuàng)建
ShortcutInfo
對象@TargetApi(Build.VERSION_CODES.N_MR1) private ShortcutInfo createShortcutInfo1() { return new ShortcutInfo.Builder(this, ID_DYNAMIC_1) .setShortLabel(getString(R.string.dynamic_shortcut_short_label1)) .setLongLabel(getString(R.string.dynamic_shortcut_long_label1)) .setIcon(Icon.createWithResource(this, R.drawable.add)) .setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("http://xiaweizi.cn/"))) .build(); }
-
調(diào)用
setDynamicShortcuts()
覆蓋掉之前的哨苛,重新設(shè)置新的動態(tài)快捷方式列表private void setDynamicShortcuts() { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N_MR1) { ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); List<ShortcutInfo> shortcutInfo = new ArrayList<>(); shortcutInfo.add(createShortcutInfo1()); shortcutInfo.add(createShortcutInfo2()); if (shortcutManager != null) { shortcutManager.setDynamicShortcuts(shortcutInfo); } } }
-
可以配置 label 的字體顏色
@TargetApi(Build.VERSION_CODES.N_MR1) private ShortcutInfo createShortcutInfo2() { Intent intent = new Intent(this, TestActivity.class); intent.setAction(Intent.ACTION_VIEW); intent.putExtra("key", "fromDynamicShortcut"); ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.BLUE); String label = getResources().getString(R.string.dynamic_shortcut_short_label2); SpannableStringBuilder colouredLabel = new SpannableStringBuilder(label); colouredLabel.setSpan(colorSpan, 0, label.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); return new ShortcutInfo.Builder(this, ID_DYNAMIC_2) .setShortLabel(colouredLabel) .setLongLabel(getString(R.string.dynamic_shortcut_long_label2)) .setIcon(Icon.createWithResource(this, R.drawable.link)) .setIntent(intent) .build(); }
最終的運行效果:
創(chuàng)建桌面快捷方式
在 Android 8.0(API26)或者更高的版本上,可以創(chuàng)建桌面快捷方式币砂。與靜態(tài)和動態(tài)快捷方式不同建峭,桌面快捷方式支持在設(shè)備上單獨的 icon 展示。
如果想創(chuàng)建桌面快捷方式决摧,按照以下步驟進行完成:
- 使用
isRequestPinShortcutSupported()
來驗證設(shè)備是否支持應(yīng)用創(chuàng)建桌面快捷方式 - 根據(jù)快捷方式是否已經(jīng)存在亿蒸,用下面兩種方式之一來創(chuàng)建
ShortcutInfo
對象:- 如果快捷方式已經(jīng)存在,請創(chuàng)建僅包含現(xiàn)有快捷方式 id 的
ShortcutInfo
對象蜜徽,系統(tǒng)自動查找并帶上與快捷方式有關(guān)的所有相關(guān)數(shù)據(jù) - 如果要固定新的快捷方式,請創(chuàng)建一個
ShortcutInfo
對象票摇,其中包含新的快捷方式 id拘鞋、意圖和短標(biāo)簽
- 如果快捷方式已經(jīng)存在,請創(chuàng)建僅包含現(xiàn)有快捷方式 id 的
- 嘗試通過調(diào)用
requestPinShortcut()
將快捷方式固定到設(shè)備桌面上,在此過程中矢门,可以傳入pendingIntent
對象盆色,該對象僅在快捷方式成功固定時告知應(yīng)用。
具體的代碼可參考下面:
private void createPinnedShortcuts() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
if (shortcutManager != null && shortcutManager.isRequestPinShortcutSupported()) {
Intent intent = new Intent(this, TestActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra("key", "fromPinnedShortcut");
ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(this, "my-shortcut")
.setShortLabel(getString(R.string.pinned_shortcut_short_label2))
.setLongLabel(getString(R.string.pinned_shortcut_long_label2))
.setIcon(Icon.createWithResource(this, R.drawable.add))
.setIntent(intent)
.build();
Intent pinnedShortcutCallbackIntent = shortcutManager.createShortcutResultIntent(pinShortcutInfo);
PendingIntent successCallback = PendingIntent.getBroadcast(this, 0,
pinnedShortcutCallbackIntent, 0);
boolean b = shortcutManager.requestPinShortcut(pinShortcutInfo, successCallback.getIntentSender());
Utils.showToast(this, "set pinned shortcuts " + (b ? "success" : "failed") + "!");
}
}
}
最終運行效果:
好了祟剔,基礎(chǔ)簡單的使用就介紹到這了隔躲,相信對 Shortcuts 的使用場景和具體實現(xiàn)都有一定的了解了,接下來開始介紹進階的使用物延。
Shortcuts 進階使用
快捷方式創(chuàng)建完成后宣旱,可能還需要對其進行管理,比如動態(tài)更新或者禁用某些快捷方式叛薯,此時就需要了解一些進階的使用了浑吟。
移除 Shortcut
對于 靜態(tài)快捷方式 而言,其在一開始就打包到了 apk 或者 apk bundle 中耗溜,是不允許對其進行更改的组力,除非發(fā)布新的版本覆蓋掉之前的快捷方式,不然會一直存在抖拴。
對于 動態(tài)快捷方式 燎字,既然可以在代碼中進行創(chuàng)建,同樣也可以在代碼中進行移除阿宅,這個之前也介紹過候衍。
而對于 桌面快捷方式,它直接展示在桌面上洒放,始終可見脱柱,僅在以下情況才能刪除桌面快捷方式。
- 用戶主動移除
- 卸載與快捷方式的應(yīng)用
- 用戶在應(yīng)用信息中拉馋,清除全部的緩存數(shù)據(jù)
Shortcut 展示順序
對于一個應(yīng)用上所有的快捷方式榨为,展示的規(guī)則按照以下順序:
-
靜態(tài)快捷方式:
isDeclaredInManifest()
放回 true 的快捷方式 -
動態(tài)快捷方式:
ShortcutInfo.isDynamic()
返回 true 的快捷方式
在每種快捷方式中惨好,又會按照 ShortcutInfo.getRank()
按等級遞增的順序排序。等級是非負的随闺,連續(xù)的整數(shù)日川, 調(diào)用 updateShortcuts(List)
,addDynamicShortcuts(List)
或 setDynamicShortcuts(List)
時矩乐,可以更新現(xiàn)有快捷方式的等級龄句。
排名是自動調(diào)整的,因此它們對于每種類型的快捷方式都是唯一的散罕。 例如分歇,有三個 rank 分別為 0、1和2 的動態(tài)快捷方式欧漱,此時再添加一個 rank 為 1 的動態(tài)快捷方式放在第二的位置上职抡,那最后兩個就會被順延一個位置,rank 變成 2和3误甚。
Shortcut intents 配置
如果希望應(yīng)用在用戶激活快捷方式時執(zhí)行多項操作缚甩,則可以將其配置為觸發(fā)后多項活動。你可以通過分配多個 intent窑邦,啟動一個 activity 到另一個 activity擅威,具體的要取決你快捷方式的類型。
使用 ShortcutInfo.Builder
創(chuàng)建快捷方式時冈钦,可以使用 setIntents()
而不是 setIntent()
郊丛。通過調(diào)用 setIntents()
你可以在用戶點擊快捷方式時觸發(fā)多個 activity,將除列表中最后一個 activity 之外的所有 activity 放在后續(xù)堆棧中瞧筛。如果此時點擊返回按鈕宾袜,會按照之前存儲的堆棧 activity 順序進行展示,而不是直接回到首頁驾窟。
比如按照下面代碼配置多個 intent:
@TargetApi(Build.VERSION_CODES.N_MR1)
private ShortcutInfo createShortcutInfo1() {
Intent intent1 = new Intent(Intent.ACTION_VIEW, Uri.parse("http://xiaweizi.cn/"));
Intent intent = new Intent(this, TestActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra("key", "fromDynamicShortcut");
return new ShortcutInfo.Builder(this, ID_DYNAMIC_1)
.setShortLabel(getString(R.string.dynamic_shortcut_short_label1))
.setLongLabel(getString(R.string.dynamic_shortcut_long_label1))
.setIcon(Icon.createWithResource(this, R.drawable.add))
.setIntents(new Intent[]{intent, intent1})
.build();
}
那么它會一次觸發(fā) intent 和 intent1,此時 intent 被壓入 intent1 的棧底庆猫,點擊返回,則展示 intent 的信息绅络。如圖:
還有一個問題月培,靜態(tài)快捷方式是不能擁有自定的 intent flag
的,靜態(tài)快捷方式始終設(shè)置為 Intent.FLAG_ACTIVITY_NEW_TASK
和 Intent.FLAG_ACTIVITY_CLEAR_TASK
這意味著恩急,當(dāng)應(yīng)用程序已經(jīng)在運行時杉畜,啟動靜態(tài)快捷方式時,應(yīng)用中所有的活動都將被銷毀衷恭。如果不希望出現(xiàn)這種情況此叠,可以使用 trampoline activity,或者在 Activity.onCreate(Bundle)
中啟動一個 不可見的 activity随珠,然后調(diào)用 Activity.finish()
灭袁。
- 在
AndroidManifest.xml
中猬错,trampoline activity
應(yīng)用設(shè)置android:taskAffinity=""
。 - 在快捷方式資源文件中茸歧,靜態(tài)快捷方式中的 intent 應(yīng)引用
trampoline activity
倦炒。
更新 pinned Shortcuts
每個應(yīng)用最多包含 getMaxShortcutCountPerActivity()
個快捷方式,其中包括動態(tài)和靜態(tài)的總和软瞎。但是桌面快捷方式的數(shù)量是不限制的逢唤。
當(dāng)動態(tài)快捷方式被放置到桌面時,即使代碼中將該動態(tài)快捷方式移除涤浇,桌面的還依然存在鳖藕,因此對于桌面的快捷方式是不止 getMaxShortcutCountPerActivity
的限制的。
假設(shè) getMaxShortcutCountPerActivity()
的值為4:
聊天應(yīng)用程序發(fā)布四個動態(tài)快捷方式只锭,表示最近的四個對話(c1,c2,c3,c4)
用戶將所有的快捷方式復(fù)制到桌面
-
然后用戶又啟動三個額外的最近對話(c5,c6和c7)著恩,這是重新發(fā)布更新動態(tài)快捷方式,那新的快捷方式列表為:c4,c5,c6,c7纹烹。改應(yīng)用必須刪除過 c1,c2喝c3页滚,因為只能展示四個快捷方式召边,但是桌面已經(jīng)保存的這三個快捷方式是可以正常訪問的铺呵。
用戶現(xiàn)在其實可以總共訪問七個快捷方式,其中包括四個最大的動態(tài)快捷方式和桌面的三個快捷方式
應(yīng)用程序可以使用
updateShortcuts(List)
來更新上述七個任意快捷方式使用
addDynamicShortcuts()
和setDynamicShortcuts()
同樣可以更新具有相同 shortcutId 的快捷方式對象隧熙,但是他們不能跟新非動態(tài)的快捷方式片挂。
系統(tǒng)設(shè)置更改
系統(tǒng)設(shè)置的更改,比如修改系統(tǒng)的語言贞盯,Shortcuts 是不能動態(tài)更新的音念,此時需要創(chuàng)建廣播監(jiān)聽 Intent.ACTION_LOCALE_CHANGED
,當(dāng)收到廣播時重新更新快捷方式,保證快捷方式展示沒有問題躏敢。
處理前:
處理后:
track Shortcuts
為了確定靜態(tài)和動態(tài)快捷方式以哪種方式出現(xiàn)闷愤,每次啟動都會檢查快捷方式的激活歷史記錄〖啵可以通過調(diào)用 reportShortcutUsed()
方法傳入其 shortcutId讥脐,提高 action 的響應(yīng)速度。
ShortCuts 頻率限制
當(dāng)使用 setDynamicShortcuts()
啼器、addDynamicShortcuts()
和 updateDynamicShortcuts()
方法時旬渠,需要注意的是,你可能在后臺調(diào)用這方法是有固定的次數(shù)限制的端壳,那可以調(diào)用方法的次數(shù)限制就是 rate limiting告丢。此功能用于防止 ShortcutManager
過度消耗設(shè)備資源。
當(dāng)處于 rate limiting 中损谦,isRateLimitingActive()
返回 true岖免,但是在某些操作執(zhí)行會重置這個值岳颇,因此即使是在后臺應(yīng)用程序也可以調(diào)用 shortcutManager
方法,直到再次達到速率限制觅捆。這些操作包括:
- 應(yīng)用再次回到前臺
- 系統(tǒng)區(qū)域設(shè)置更改
- 用戶在通知欄處理嵌入的交互操作
如果在開發(fā)或者測試中遇到次數(shù)被限制的情況赦役,可以在 開發(fā)者選項中 -> 重置 ShortcutsManager 調(diào)用頻率限制 來恢復(fù)≌こ矗或者使用 adb 命令
adb shell cmd shortcut reset-throttling [ --user your-user-id ]
建議
在設(shè)計和創(chuàng)建快捷方式時掂摔,請遵循以下建議:
遵循設(shè)計準(zhǔn)則
要使應(yīng)用程序的快捷方式與系統(tǒng)應(yīng)用程序使用的快捷方式在視覺上保持一致,請遵循 快捷方式設(shè)計指南
僅發(fā)布四個不同的快捷方式
盡管 API 目前支持給任何應(yīng)用最多五個快捷方式(靜態(tài)和動態(tài))赢赊,但還是建議僅發(fā)布四個不同的快捷方式乙漓,以改善在設(shè)備上的視覺效果。
限制快捷方式的描述長度
快捷方式的菜單空間有限释移,在桌面展示應(yīng)用程序需要考慮到這個因素叭披。如果可以的話,將快捷方式的 shortLable 長度限制在 10 個字符玩讳,并將 longLable 長度限制在 25個字符涩蜘。
記錄快捷方式和其操作的歷史記錄
對于創(chuàng)建的每個快捷方式,請考慮用戶在應(yīng)用中是否可以直接用不同方式來完成相同的任務(wù)熏纯,需要記住的是同诫,這種情況下,調(diào)用 reportShortcutUsed()
樟澜,這樣 launcher 就可以提高 shortcut 對應(yīng)的 actions 的響應(yīng)速度误窖。
只有在 shortcuts 的意義存在時更新
當(dāng)改變動態(tài)快捷方式時,只有在 shortcut 仍然保持它的含義時秩贰,調(diào)用 updateShortcuts()
方法改變它的信息霹俺,否則,應(yīng)該使用 addDynamicShortcuts()
或 setDynamicShortcuts()
創(chuàng)建一個具有新含義的 shortcutId 的快捷方式毒费。
例如丙唧,如果我們已經(jīng)創(chuàng)建了導(dǎo)航到一個超市的快捷方式,如果超市的名稱改變了但是位置并沒有變化時觅玻,只更新信息是合適的想际,但是如果用戶開始再一個不同位置的超市購物時,最好就是創(chuàng)建一個新的快捷方式串塑。
每次打開 APP 都需要檢查快捷方式
在備份或恢復(fù)時沼琉,動態(tài) shortcuts 不會被保存, 正是因為這個原因桩匪,推薦我們在需要 APP 啟動和重新發(fā)布動態(tài)快捷方式時打瘪,檢查 getDynamicShortcuts()
的對象的數(shù)量。
參考自