作者 | Android_zhu_jiang
責(zé)編 | 屠敏
出品 | CSDN 博客
蘋果在iPhone 6s和iPhone 6s Plus開始新增了3D Touch,這個(gè)功能褒貶不一,但我覺得還是特別好用的,特別是在微信上付款、加好友、掃二維碼,或是在支付寶上付款等等場景。好用的真的是不要不要的,下面是蘋果3D Touch的截圖:
這么好用的功能安卓能不模仿嗎?呸!能不實(shí)現(xiàn)嗎?
從安卓7.1(25)開始,系統(tǒng)新增了Shortcut來實(shí)現(xiàn)類似蘋果3D Touch的功能,實(shí)現(xiàn)效果如下:
開始實(shí)現(xiàn)
實(shí)現(xiàn)呢,一共有三種方式,安卓官方是這樣來描述的:
我就用官方直譯來翻譯下湊合理解吧:
創(chuàng)建快捷方式
快捷方式可幫助用戶快速訪問應(yīng)用程序的各個(gè)部分,從而為用戶提供特定類型的內(nèi)容。
使用快捷方式交付內(nèi)容的方式取決于您的用例以及快捷方式的上下文是應(yīng)用程序驅(qū)動(dòng)還是用戶驅(qū)動(dòng)。盡管靜態(tài)快捷方式的上下文不會(huì)更改,而動(dòng)態(tài)快捷方式的上下文會(huì)不斷更改,但是在兩種情況下,上下文都是由您的應(yīng)用程序驅(qū)動(dòng)的。如果用戶選擇自己希望您的應(yīng)用向其交付內(nèi)容的方式(例如固定快捷方式),則上下文由用戶定義。以下方案演示了每種快捷方式類型的一些用例:
- 靜態(tài)快捷方式 最適合在用戶與應(yīng)用程序互動(dòng)的整個(gè)生命周期中使用一致結(jié)構(gòu)鏈接到內(nèi)容的應(yīng)用程序。 由于大多數(shù)啟動(dòng)器一次 只能顯示四個(gè)快捷方式,因此靜態(tài)快捷方式對于常見活動(dòng)很有用。例如,如果用戶希望以特定方式查看其日歷或電子郵件,則使用靜態(tài)快捷方式可確保他們執(zhí)行例行任務(wù)的經(jīng)驗(yàn)是一致的。
- 動(dòng)態(tài)快捷鍵 用于上下文相關(guān)的應(yīng)用程序中的操作。 例如,如果您構(gòu)建的游戲允許用戶在啟動(dòng)時(shí)從其當(dāng)前級別開始,則快捷方式將需要經(jīng)常更新。使用動(dòng)態(tài)快捷方式允許每次用戶清除級別時(shí)更新該快捷方式。
- 固定的快捷方式 用于特定的,用戶驅(qū)動(dòng)的操作。 例如,用戶可能想要將特定網(wǎng)站固定到啟動(dòng)器。這是有好處的,因?yàn)榕c使用瀏覽器的默認(rèn)實(shí)例相比,它使用戶可以更快地執(zhí)行自定義操作,例如一步導(dǎo)航到網(wǎng)站。
靜態(tài)快捷方式
1、在AndroidManifest.xml中找見你的啟動(dòng)項(xiàng)Activity,在其中添加一個(gè)元素,該元素引用定義了應(yīng)用程序快捷方式的資源文件:
< activityandroid:name= ".MainActivity">
< intent-filter>
< actionandroid:name= "android.intent.action.MAIN"/>
< categoryandroid:name= "android.intent.category.LAUNCHER"/>
</ intent-filter>
< meta-dataandroid:name= "android.app.shortcuts"
android:resource= "@xml/shortcuts"/>
</ activity>
2、上面的shortcuts文件詳情如下,其中定義了基本參數(shù)和意圖:
<?xml version="1.0" encoding="utf-8"?>
< shortcutsxmlns:android= "schemas.android/apk/res/android">
< shortcut
android:enabled= "true"
android:icon= "@drawable/one"
android:shortcutDisabledMessage= "@string/static_disabled_message"
android:shortcutId= "staticId"
android:shortcutLongLabel= "@string/static_shortcut_long_label"
android:shortcutShortLabel= "@string/static_shortcut_short_label">
< categoriesandroid:name= "android.shortcut.conversation"/>
< intent
android:action= "android.intent.action.VIEW"
android:targetClass= "com.zj.shortcut.Main2Activity"
android:targetPackage= "com.zj.shortcut"/>
</ shortcut>
</ shortcuts>
3、上面的文件中有很多的屬性,下面來一一講解一下:
- android:shortcutId 和 android:shortcutShortLabel 是必填值,其他都是可選的。
- android:shortcutId 字符串文字,表示對象對其執(zhí)行操作時(shí)的快捷方式。
- android:shortcutShortLabel 簡短的描述,描述了快捷方式的用途。盡可能將快捷方式的“簡短描述”的長度限制為10個(gè)字符,不然在手機(jī)上顯示效果可能不太好。
- android:shortcutLongLabel 描述該快捷方式用途的擴(kuò)展短語。如果有足夠的空間,啟動(dòng)器將顯示此值而不是上面的簡短的描述。如果可能,將快捷方式的“詳細(xì)描述”的長度限制為25個(gè)字符。
- android:shortcutDisabledMessage 當(dāng)用戶嘗試啟動(dòng)禁用的快捷方式時(shí),在受支持的啟動(dòng)器中顯示的消息。該消息應(yīng)向用戶說明為什么現(xiàn)在禁用了快捷方式。如果android:enabled為,則此屬性的值無效true。
- android:enabled 確定用戶是否可以與受支持的啟動(dòng)器中的快捷方式進(jìn)行交互。默認(rèn)值android:enabled是true。如果將其設(shè)置為false,則還應(yīng)該設(shè)置一個(gè)android:shortcutDisabledMessage,以說明為什么禁用了快捷方式。如果您不需要提供這樣的消息,則最簡單的方法是從XML文件中完全刪除快捷方式。
- android:icon 啟動(dòng)器在向用戶顯示快捷方式時(shí)使用 的位圖 或 自適應(yīng)圖標(biāo)。該值可以是圖像的路徑,也可以是包含該圖像的資源文件。盡可能使用自適應(yīng)圖標(biāo)來提高性能和一致性。
4、上面的字符串都定義在了res->value->string.xml中,下面是代碼:
< stringname= "static_disabled_message">測試信息</ string>
< stringname= "static_shortcut_long_label">測試長標(biāo)題</ string>
< stringname= "static_shortcut_short_label">測試短標(biāo)題</ string>
5、下面來看一下靜態(tài)展示安卓的“3D Touch”:
動(dòng)態(tài)快捷方式
1、動(dòng)態(tài)快捷鍵提供了指向應(yīng)用程序中特定于上下文的特定操作的鏈接。這些操作可能會(huì)在您的應(yīng)用使用之間發(fā)生變化,甚至在應(yīng)用運(yùn)行時(shí)也會(huì)發(fā)生變化。動(dòng)態(tài)快捷方式的選擇包括呼叫特定人員,導(dǎo)航至特定位置以及從用戶的最后保存點(diǎn)加載游戲等等。
這是ShortcutManagerAPI的地址:https://developer.android.google/reference/android/content/pm/ShortcutManager.html
- 發(fā)布:使用 setDynamicShortcuts重新定義動(dòng)態(tài)快捷鍵的完整列表,或者使用 addDynamicShortcuts 以增加動(dòng)態(tài)快捷鍵的現(xiàn)有列表。
- 更新:使用 updateShortcuts方法。
- 刪除:使用刪除一組動(dòng)態(tài)快捷方式 removeDynamicShortcuts,或使用 刪除所有動(dòng)態(tài)快捷方式 removeAllDynamicShortcuts。
2、下面是動(dòng)態(tài)添加快捷方式的代碼(注意要加版本注解):
@TargetApi(Build.VERSION_CODES.N_MR1)
@RequiresApi(Build.VERSION_CODES.M)
overridefunonCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
valshortcutManager = getSystemService<ShortcutManager>(ShortcutManager:: class. java)
valshortcut = ShortcutInfo.Builder( this, "id1")
.setShortLabel( "Website")
.setLongLabel( "Open the website")
.setIcon(Icon.createWithResource( this, R.drawable.ic_launcher_background))
.setIntent(
Intent(
Intent.ACTION_VIEW,
Uri.parse( "https://baidu/"))
)
.build
shortcutManager!!.dynamicShortcuts = listOf(shortcut)
}
3、下面是添加完之后運(yùn)行界面樣式:
固定快捷方式
在Android 8.0(API級別26)及更高版本上,可以創(chuàng)建固定的快捷方式。與靜態(tài)和動(dòng)態(tài)快捷方式不同,固定的快捷方式在支持的啟動(dòng)器中顯示為單獨(dú)的圖標(biāo)。圖1顯示了這兩種快捷方式之間的區(qū)別。
1、使用 isRequestPinShortcutSupported驗(yàn)證應(yīng)用程序內(nèi)設(shè)備的默認(rèn)啟動(dòng)支持快捷鍵。
2、ShortcutInfo根據(jù)快捷方式是否已存在,以兩種方式之一創(chuàng)建對象:
- 如果快捷方式已經(jīng)存在,請創(chuàng)建一個(gè) ShortcutInfo僅包含現(xiàn)有快捷方式ID的對象。系統(tǒng)會(huì)自動(dòng)查找并固定與快捷方式相關(guān)的所有其他信息
- 如果要固定新的快捷方式,請創(chuàng)建一個(gè)ShortcutInfo對象,其中包含新快捷方式 的ID,意圖和簡短標(biāo)簽。
- 注意:因?yàn)橄到y(tǒng)會(huì)自動(dòng)對固定的快捷方式執(zhí)行 備份和還原,所以這些快捷方式的ID應(yīng)該包含穩(wěn)定,恒定的字符串或服務(wù)器端標(biāo)識符,而不是本地生成的標(biāo)識符,這些標(biāo)識符在其他設(shè)備上可能沒有意義。
3、通過調(diào)用將快捷方式固定到設(shè)備的啟動(dòng)器 requestPinShortcut。在此過程中,可以傳入一個(gè) PendingIntent對象,該對象僅在成功固定快捷方式后才通知應(yīng)用。
注意:如果用戶不允許將快捷方式固定在啟動(dòng)器上,則您的應(yīng)用不會(huì)收到回調(diào)。固定快捷方式后,可以使用 updateShortcuts方法更新其內(nèi)容 。
4、下面是創(chuàng)建固定快捷方式的代碼:
@SuppressLint( "NewApi")
privatefuninitShortcut{
valshortcutManager = getSystemService(ShortcutManager:: class. java)
if(shortcutManager!!.isRequestPinShortcutSupported) {
valpinShortcutInfo = ShortcutInfo.Builder( this, "id1")
.setShortLabel( "Website")
.setLongLabel( "Open the website")
.setIcon(Icon.createWithResource( this, R.drawable.ic_launcher_background))
.setIntent(
Intent(
Intent.ACTION_VIEW,
Uri.parse( "https://baidu/"))
)
.build
valpinnedShortcutCallbackIntent = shortcutManager.createShortcutResultIntent(pinShortcutInfo)
valsuccessCallback = PendingIntent.getBroadcast( this, 0,
pinnedShortcutCallbackIntent, 0)
shortcutManager.requestPinShortcut(pinShortcutInfo,
successCallback.intentSender)
}
}
5、運(yùn)行結(jié)果如下:
版權(quán)聲明:本文為CSDN博主「Android_zhu_jiang」的原創(chuàng)文章,僅用于技術(shù)交流,分享心得。
想為博主點(diǎn)贊?
想要請教博主?
快速 獲取與博主直面溝通的方式吧!


