『Android Tip』-- Shortcuts 快捷方式

開篇

Shortcuts 功能跟隨著 Android7.1 Nougat 一起誕生蜡歹,其主要目在于用戶可以定義一些常用的操作路徑,以快捷方式的形式存在鳖宾,這些快捷方式展示在可以支持的設(shè)備上掀亩,幫助用戶快速啟動常用或者推薦的頁面和行為卢鹦。

最近也是有 Shortcut 相關(guān)的需求需要開發(fā)悄泥,特此進行了總結(jié)虏冻,希望可以幫助到大家。ShortcutsDemo

概覽

快捷方式一般是以兩種方式存在:

一種通過 長按 應(yīng)用 icon弹囚,此時會彈出列表彈窗厨相,里面展示需要操作的路徑,對于沒有配置快捷方式的應(yīng)用鸥鹉,一般只會展示分享或者應(yīng)用信息的入口(不同手機可能展示不一樣)蛮穿。如果該應(yīng)用配置了快捷方式,那么在列表中則會展示對應(yīng)的快捷方式入口毁渗。

沒有配置
配置的

如上圖所示践磅,配置和沒有配置快捷方式的區(qū)別就在于,列表中是否配置自定義的快捷方式入口灸异。

另一種則以桌面快捷方式的形式存在府适,同一種行為可以存在多個相同的桌面快捷方式幻碱。

pinedShow

如上圖,對于 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ū)動浑厚。

怎么理解呢股耽?用簡書作為例子進行講解:

image-20190511163016540
  • 靜態(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)建:

  1. AndroidManifest.xml 中找到配置 android.intent.action.MAINandroid.intent.category.LAUNCHERActivity傻咖。

  2. 添加 <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>
    
  3. 創(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)頁面的完整路徑
  1. 如果有數(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));
      }
    }
    

最終的運行效果:

staticShortcut

創(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)建為例,其他差不多础淤,自行嘗試崭放,具體的操作可參考下面的代碼:

  1. 創(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();
    }
    
  2. 調(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);
        }
      }
    }
    
  3. 可以配置 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();
    }
    

最終的運行效果:

dynamicShortcut

創(chuàng)建桌面快捷方式

在 Android 8.0(API26)或者更高的版本上,可以創(chuàng)建桌面快捷方式币砂。與靜態(tài)和動態(tài)快捷方式不同建峭,桌面快捷方式支持在設(shè)備上單獨的 icon 展示。

如果想創(chuàng)建桌面快捷方式决摧,按照以下步驟進行完成:

  1. 使用 isRequestPinShortcutSupported() 來驗證設(shè)備是否支持應(yīng)用創(chuàng)建桌面快捷方式
  2. 根據(jù)快捷方式是否已經(jīng)存在亿蒸,用下面兩種方式之一來創(chuàng)建 ShortcutInfo 對象:
    1. 如果快捷方式已經(jīng)存在,請創(chuàng)建僅包含現(xiàn)有快捷方式 id 的 ShortcutInfo 對象蜜徽,系統(tǒng)自動查找并帶上與快捷方式有關(guān)的所有相關(guān)數(shù)據(jù)
    2. 如果要固定新的快捷方式,請創(chuàng)建一個 ShortcutInfo 對象票摇,其中包含新的快捷方式 id拘鞋、意圖和短標(biāo)簽
  3. 嘗試通過調(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") + "!");
    }
  }
}

最終運行效果:

pinnedShortcut

好了祟剔,基礎(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ī)則按照以下順序:

  1. 靜態(tài)快捷方式: isDeclaredInManifest() 放回 true 的快捷方式
  2. 動態(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 的信息绅络。如圖:

intents

還有一個問題月培,靜態(tài)快捷方式是不能擁有自定的 intent flag 的,靜態(tài)快捷方式始終設(shè)置為 Intent.FLAG_ACTIVITY_NEW_TASKIntent.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()灭袁。

  1. AndroidManifest.xml 中猬错, trampoline activity 應(yīng)用設(shè)置 android:taskAffinity=""
  2. 在快捷方式資源文件中茸歧,靜態(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:

  1. 聊天應(yīng)用程序發(fā)布四個動態(tài)快捷方式只锭,表示最近的四個對話(c1,c2,c3,c4)

  2. 用戶將所有的快捷方式復(fù)制到桌面

  3. 然后用戶又啟動三個額外的最近對話(c5,c6和c7)著恩,這是重新發(fā)布更新動態(tài)快捷方式,那新的快捷方式列表為:c4,c5,c6,c7纹烹。改應(yīng)用必須刪除過 c1,c2喝c3页滚,因為只能展示四個快捷方式召边,但是桌面已經(jīng)保存的這三個快捷方式是可以正常訪問的铺呵。

    用戶現(xiàn)在其實可以總共訪問七個快捷方式,其中包括四個最大的動態(tài)快捷方式和桌面的三個快捷方式

  4. 應(yīng)用程序可以使用 updateShortcuts(List) 來更新上述七個任意快捷方式

  5. 使用 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)收到廣播時重新更新快捷方式,保證快捷方式展示沒有問題躏敢。

處理前:

before

處理后:

after

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方法,直到再次達到速率限制觅捆。這些操作包括:

  1. 應(yīng)用再次回到前臺
  2. 系統(tǒng)區(qū)域設(shè)置更改
  3. 用戶在通知欄處理嵌入的交互操作

如果在開發(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ù)量。

參考自

官方Demo

官方文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市闺骚,隨后出現(xiàn)的幾起案子彩扔,更是在濱河造成了極大的恐慌,老刑警劉巖僻爽,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虫碉,死亡現(xiàn)場離奇詭異,居然都是意外死亡胸梆,警方通過查閱死者的電腦和手機敦捧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碰镜,“玉大人兢卵,你說我怎么就攤上這事⌒饔保” “怎么了秽荤?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柠横。 經(jīng)常有香客問我窃款,道長,這世上最難降的妖魔是什么牍氛? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任晨继,我火速辦了婚禮,結(jié)果婚禮上糜俗,老公的妹妹穿的比我還像新娘踱稍。我一直安慰自己曲饱,他們只是感情好悠抹,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扩淀,像睡著了一般楔敌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驻谆,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天卵凑,我揣著相機與錄音,去河邊找鬼胜臊。 笑死勺卢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的象对。 我是一名探鬼主播黑忱,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甫煞?” 一聲冷哼從身側(cè)響起菇曲,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抚吠,沒想到半個月后常潮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡楷力,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年喊式,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萧朝。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡垃帅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剪勿,到底是詐尸還是另有隱情贸诚,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布厕吉,位于F島的核電站酱固,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏头朱。R本人自食惡果不足惜运悲,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望项钮。 院中可真熱鬧班眯,春花似錦、人聲如沸烁巫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亚隙。三九已至磁餐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阿弃,已是汗流浹背诊霹。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留渣淳,地道東北人脾还。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像入愧,于是被迫代替她去往敵國和親晶乔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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