今天的主角:Shortcuts 怎麼使用使用Shortcuts? Shortcuts 跟BroadcastReceiver一樣,可以靜態註冊也可以利用java程式碼動態註冊。 先來講一下怎麼靜態註冊Static ShortCuts
- 首先, 我們需要在res/xml目錄下建立一個新的xml檔案,
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="settings"
android:enabled="true"
android:icon="@drawable/icon"
android:shortcutShortLabel="@string/settings_short_name"
android:shortcutLongLabel="@string/settings_long_name"
android:shortcutDisabledMessage="@string/settings_disable_msg">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="org.loader.shotcutsstatic"
android:targetClass="org.loader.shotcutsstatic.SettingsActivity" />
<categories android:name="android.shortcut.conversation"/>
</shortcut>
</shortcuts>
複製程式碼
- 首先一個shortcuts標籤, 然後是一個shortcut, 到這裡我們大概可以猜測到這裡可以註冊多個shortcut, shortcut標籤有很多屬性, 我們來一個個的瞭解下.
- shortcutId, 不用多說, 這肯定是一個唯一的id
- enabled, 表示這個shortcut是否可用
- shortcutShortLabel, 這裡是配置的短名稱, 下面還會有長名稱, 如果長名稱顯示不下, 就顯示短名稱
- shortcutLongLabel, 這裡是配置的長名稱, launcher會優先選擇長名稱顯示
- shortcutDisabledMessage, 這個配置是在我們選擇一個不可用的shortcut時給使用者的一個
在shortcut標籤下還有兩個我們熟悉的標籤.
-
1.intent, 這裡表示我們點選shortcut時要幹嘛, targetPackage是指定一個目標應用的包名,
-
2.targetClass是我們要跳轉的目標類, 這裡要注意的是android:action一定要配置, 否則會崩潰
-
3.categories, 這個東西目前位置官方只給提供了android.shortcut.conversation
ok, 上面的幾行程式碼, 我們一個static shortcuts就完成了, 那如何使用呢? 是在manifest中配置activity的地方使用, 而且這個activity是有要求的.
能配置shortcuts的activity必須要有action是android.intent.action.MAIN和category是android.intent.category.LAUNCHER!
一個正確的配置示例:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<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>
<activity android:name=".SettingsActivity" />
</application>
複製程式碼
來看看最終實現的效果:
ok, 到這裡, 靜態配置shortcuts我們就學習完了, 是不是很簡單? 那這個靜態配置是用在什麼地方呢? 我想了想, 這裡適用的場景一般是一些固定不變的功能, 例如你APP的設定介面, 如果是一些動態的資料, 那靜態配置就不適合了, 就需要我們接下來要介紹到了動態配置了.
使用Dynamic Shortcuts
在看完Static Shortcuts後, 我們不相信Google僅僅給我們開發者開放了侷限性如此大的使用方式, 肯定還會存在靈活性更大的API, 是的, 這就是我們馬上要講的Dynamic Shortcuts, 我把它稱為動態配置. 說起動態配置, 那肯定是用java程式碼實現了, 那如何實現呢? 首先第一步, 我們需要利用一下程式碼拿到ShortcutManager
getSystemService(ShortcutManager.class)
複製程式碼
拿到ShortcutManager後, 我們可以呼叫setDynamicShortcuts(List)方法去設定Shortcut, 那這個List如何得到呢? 我們來看看完整點的程式碼。
private void setupShortcuts() {
mShortcutManager = getSystemService(ShortcutManager.class);
List<ShortcutInfo> infos = new ArrayList<>();
for (int i = 0; i < mShortcutManager.getMaxShortcutCountPerActivity(); i++) {
Intent intent = new Intent(this, MessageActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra("msg", "我和" + mAdapter.getItem(i) + "的對話");
ShortcutInfo info = new ShortcutInfo.Builder(this, "id" + i)
.setShortLabel(mAdapter.getItem(i))
.setLongLabel("聯絡人:" + mAdapter.getItem(i))
.setIcon(Icon.createWithResource(this, R.drawable.icon))
.setIntent(intent)
.build();
infos.add(info);
// manager.addDynamicShortcuts(Arrays.asList(info));
}
mShortcutManager.setDynamicShortcuts(infos);
}
複製程式碼
這段程式碼的背景是我們模擬了一個聯絡人列表功能, 在launcher中我們長按圖示會出現一定數量的聯絡人快捷方式, 點選某個快捷方式會直接跳轉該聯絡人相關的頁面. 好, 介紹完背景, 我們來看程式碼, 首先我們通過getSystemService(ShortcutManager.class)來拿到ShortcutManager, 接下來一個for迴圈, 注意這個for迴圈的次數, 因為我們要新增的Shortcut不能是無限個, 所以這裡我們用getMaxShortcutCountPerActivity來獲取到最大個數. 然後在for迴圈裡, 我們首先構造一個intent, 注意, 這裡和Static Shortcut一樣, 必須要提供一個Action. 然後我們用ShortcutInfo.Builder來構造一個ShortcutInfo並且放到List中, 最終我們呼叫mShortcutManager.setDynamicShortcuts(infos)來設定Shortcuts.
好了, 程式碼其實很簡單, 我們來看看效果.
- 動態更新 Shortcuts
上面的程式碼我們雖然說是Dynamic, 但僅僅是使用java程式碼實現的罷了, 真正的Dynamic我們接下來才去講解, 在講解Dynamic之前, 我們先來介紹一個名詞-Pinning Shortcuts, 這是個啥玩意呢? 其實對於Shortcut, Android是允許我們直接放到桌面的, 這樣就更加方便了使用者的操作, google把他稱作為Pinning Shortcuts, 具體啥樣, 我們來張圖就明白了.
對於這個Pinning Shortcuts, google的文件說, 我們開發者是沒有權利去刪除的, 能刪除它的只有使用者. 那我該項功能刪除了咋辦? 這東西還在桌面上, 是不是APP要崩? 當然Google考慮到了這點, 它允許我們去disable這個shortcut. 具體還是來看程式碼, 這裡我們長按item來模擬一下刪除.
private void removeItem(int index) {
List<ShortcutInfo> infos = mShortcutManager.getPinnedShortcuts();
for (ShortcutInfo info : infos) {
if (info.getId().equals("id" + index)) {
mShortcutManager.disableShortcuts(Arrays.asList(info.getId()), "暫無該聯絡人");
}
}
mShortcutManager.removeDynamicShortcuts(Arrays.asList("id" + index));
}
首先我們先呼叫mShortcutManager.getPinnedShortcuts()來獲取到所有的Pinning Shortcuts, 然後去遍歷它, 找到我們刪除的那個, 然後通過APIdisableShortcuts(List<Ids>)來disable掉該項, 最後我們還要用過removeDynamicShortcuts(List<Ids>)來從shortcuts中移除. 來看看效果.
複製程式碼
通過效果中, 我們可以看到, 我們disableShortcuts的那個Pinning Shortcut已經變灰了, 而且在點選的時候會提醒暫無該聯絡人, 這個提醒正是disableShortcuts的第二個引數.
現在, 刪除和禁用我們已經瞭解了, 那更新呢? 假如我修改了某個聯絡人的名字, shortcut是不是也應該相應的修改呢? 是的, 這裡還是需要我們通過程式碼來實現.
private void updItem(int index) {
Intent intent = new Intent(this, MessageActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra("msg", "我和" + mAdapter.getItem(index) + "的對話");
ShortcutInfo info = new ShortcutInfo.Builder(this, "id" + index)
.setShortLabel(mAdapter.getItem(index))
.setLongLabel("聯絡人:" + mAdapter.getItem(index))
.setIcon(Icon.createWithResource(this, R.drawable.icon))
.setIntent(intent)
.build();
mShortcutManager.updateShortcuts(Arrays.asList(info));
}
複製程式碼
構建intent我們就不說了, 接下來我們又使用ShortcutInfo.Builder來構建了一個新的ShortcutInfo, 最後我們是用過updateShortcuts(List)來實現更新shortcut的, 很簡單, 來看看效果.
5. 官網的文件大家也可以多看看, 這裡給出地址: https://developer.android.com/preview/shortcuts.html- 本文參考的該部落格: https://blog.csdn.net/xiaoyu940601/article/details/78653379
如果對您有一些微薄的幫助,可以打賞支援一下 微信
支付寶