當前位置:
首頁 > 最新 > Android開發之桌面快捷鍵使用細則

Android開發之桌面快捷鍵使用細則

今日科技快訊

國家市場監管總局網監司高度重視媒體反映的拼多多平台上銷售侵權假冒商品等問題,已經要求上海市工商局約談平台經營者,並要求上海市和其他相關地方工商、市場監管部門,對媒體反映的以及消費者、商標權利人投訴舉報的拼多多平台上銷售山寨產品、傍名牌等問題,認真開展調查檢查,不管是第三方平台還是平台內經營者,只要構成違法,都將依法嚴肅處理。

作者簡介

本篇來自騎小豬看流星的投稿,分享了 Android 開發中桌面快捷鍵的使用細則。一起來看看!希望大家喜歡。

騎小豬看流星的博客地址:

https://www.jianshu.com/u/0111a7da544b

前言

首先聲明,標題里的快捷鍵不是指開發人員使用頻率極高的 Ctrl+C 和 Ctrl+V;也不是 IDE里 Ctrl+D、Ctrl+F 等常用快捷鍵。這裡的快捷鍵,其實想要表達的是 Android 應用生成桌面快捷方式的細則。

試想,現在有一Windows 用戶想進入 D 盤——my 文件夾裡面的子文件去找文件(因為藏了些晦澀資源所以層級較深)。那麼更加便利省力的操作是:點擊選中文件夾——右鍵:發送到——桌面快捷方式,即可幫我們將快捷方式生成到桌面。該用戶下次想使用這個文件夾,直接點擊桌面上的快捷方式即可。這樣做的好處在於,用戶可以快速定位到某一應用具體的功能、乾淨利落。

當然,谷歌 Android 團隊也考慮了這一點,給我們設計了原生 API,方便我們開發人員更加便利的(Ctrl+C、V)生成桌面快捷方式。這樣做的好處我想有以下幾點,首先,提高了用戶留存率,試想一個 APP 通過某種媒介生成了2個 icon,這樣是很容易吸引人的,因為生成桌面快捷方式的 icon 以及點擊事件都是代碼可控的,比如你的快捷方式的 icon 是一個蘿莉或者御姐;正太或是直男?畢竟圖片總有人會喜歡的嘛。其次,快捷方式的點擊事件是控制的,跳轉的界面控制在開發者(產品)手中等等。

分析一波

言歸正傳,既然是生成桌面快捷方式,那麼肯定需要許可權,必要的許可權如下:

接著,因為 Android 難以言表的碎片化和廠商定製,所以還需要加一些許可權來增加健壯性,下面直接 copy 就行:

代碼實現

許可權已經添加完畢,下面就可以上代碼了,首先是創建桌面快捷方式:

創建桌面快捷方式的代碼,理論上就是上面這些,ComponentName 這個類用的較少,簡單理解 ComponentName 的作用是,可以啟動其他應用的 Activity、Service(前提是要知道包名),然後搭配 Intent 使用,完成跳轉。關於 ComponentName 與 Activity、Service 的參考代碼如下:

另外,還需要在清單配置文件裡面,對應的 Activity 和 Service 需要加上 android:exported = "true",這個 android:exported 標籤,是用來指示該服務是否能夠被其他應用程序組件調用或跟它交互。設置成 true,則能夠被調用或交互;設置 false,也就意味不能被其他組件交互。APP 入口的 Activity 不聲明默認就是 android:exported="true"。關於 ComponentName 的說明就到此為止,還不是很好理解的可以自行谷歌百度。綜上,還需要在清單文件配置一些代碼,參考如下:

這裡的 MainActivity,就是我點擊快捷方式進入的 Activity。可能你會說,我該如何傳值給,快捷方式點進去的Activity?那麼也是傳統套路根據Intent來傳值,也就是上面的 shortcutIntent,參考代碼如下:

好了,創建快捷方式的代碼是通過 sendBroadcast(resultIntent);來實現的,因此可以判斷這是系統的廣播。

刪除桌面快捷方式

首先,用戶可以直接在手機桌面拖拽快捷方式,進行刪除。另外,上面的代碼也實現了當刪除 APK 以後,自動刪除快捷方式(因為你跳轉沒有了目標,所以需要刪除)由於代碼刪除快捷方式,網上的一些代碼都有問題(又是令人無語的碎片化和廠商定製),所以這裡不提供刪除快捷方式的代碼,理論上,上面2種手動刪除實現即可。值得注意的是,如果用戶沒有手動打開許可權,也會創建失敗,也需要提示用戶手動對應用進行快捷方式許可權授權設置。

Android 7.1 系統快捷方式的變化

從Android 7.1(API 25,也就是 minSdkVersion 25 )開始,新增了ShortcutManager,顧名思義,翻譯過來就是快捷方式管理。這個類可以對桌面久按應用圖標彈出的快捷方式進行管理。那麼ShortcutManager的實現方式有2種:

第一種:XML註冊

首先, 需要在 res/xml 目錄下創建一個新的 xml 文件,根標籤是 shortcuts,參考代碼如下:

嗯,可以看到新增了很多標籤,這些標籤代表什麼意思咧?首先是 shortcut 的外部標籤:

shortcutId, 快捷方式的id

enabled:表示這個shortcut是否可用,一般設置為true即可

shortcutShortLabel:配置快捷方式的短名稱, 如果長名稱顯示不下, 就顯示短名稱

shortcutLongLabel: 配置快捷方式的長名稱, launcher會優先選擇長名稱顯示(優先順序高於shortcutShortLabel)

shortcutDisabledMessage:這個標籤的意思是指:當我們點擊一個不可用的shortcut時,給用戶一個有效提示

內部還有個intent標籤:

好了,現在通過 XML 已經寫好了快捷方式,那現在該如何使用,讓快捷方式生效?那麼,只需要在清單文件中啟動 Activity 的裡面,加入以下2行代碼(也就是通過 meta-data 配置進去)即可看到效果:

這裡的 meta-data 就是配置了桌面快捷方式的一些信息。代碼運行後,執行創建快捷方式的操作即可看到效果:

第二種註冊:代碼動態註冊

首先,獲取系統服務,固定寫法:getSystemService(ShortcutManager.class);獲取 ShortcutManager 類對象。接著,獲取完 ShortcutManager 對象以後,通過 setDynamicShortcuts( List )方法去設置 Shortcut 快捷方式具體的名字、icon 以及邏輯。既然,現在要通過 ShortcutInfo 去完成信息填充,那麼我們就先看下 ShortcutInfo 的基本寫法:

以上代碼就可以創建桌面快捷方式,通過 ShortcutInfo 的 Builder 寫法可以動態的插入快捷方式的名稱、icon、以及 Intent 邏輯。值得一提的是,ShortcutManager 最大可以創建5個,但桌面上只能最多只能顯示4個快捷方式,可能是谷歌團隊基於何種情況的考慮進行的限制,這裡就不做深入研究。另外,快捷方式的順序排列是:前面添加的顯示在下方,後面添加的顯示在上面。

另外,移除快捷方式可以調用如下 API:

Android 8.0 系統快捷方式的變化

可能是谷歌出新版本需要優化增加既有版本的一些功能從 Android 8.0(API 26,也就是 minSdkVersion 26,也就是Android O )開始,對 ShortcutManager 這個類新增了更多的管理措施。那麼 O 系統主要的擴充說明有那些?我這裡就簡單說明下。

APP 可以使用 requestPinShortcut(ShortcutInfo,IntentSender)將現有的快捷方式(靜態或動態)或全新的快捷方式固定到支持的啟動器。這倆參數的意思是:

ShortcutInfo 對象 - 如果快捷方式已存在,則該對象僅包含快捷方式的 ID。如果快捷方式不存在,新的 ShortcutInfo 對象必須包含新快捷方式的 ID,意圖和短標籤。

PendingIntent 對象 - 此意圖表示如果快捷方式成功固定到設備的啟動器,您的應用程序將收到回調。

分析:也就是說,谷歌要求新的快捷方式需要編寫的嚴謹,然後該快捷方式是否固定到設備加了新的判斷標準

分析:針對 O 系統對於服務的嚴格限制,這是對快捷方式功能的擴充

並不是所有的啟動器都支持固定快捷方式!!!所以,如果要確定該 APP 是否支持國定快捷方式,可以使用 isRequestPinShortcutSupported() 這個方法的返回值。

根據返回值,可以決定隱藏 App 中允許,用戶固定快捷方式的選項。該方法返回 TRUE,則意味著,桌面支持 requestPinShortcut;

但是用戶也可能會更改,更改選項以後,再次啟動 APP 返回值可能就會發生變化。另外,系統版本低於 Android O,那麼它支持使用舊的私有意圖com.android.launcher.action.INSTALL_SHORTCUT。requestPinShortcut 這個方法請求創建固定的快捷方式。默認啟動器將收到該請求,並要求用戶批准。如果用戶批准,將創建快捷方式,並且將發送 resultIntent。但是,如果請求被用戶拒絕,則不會向呼叫者發送任何響應。需要注意的是,只有具有前台活動或前台服務的應用程序才能調用此方法。否則,它將拋出 IllegalStateException。

分析:也就是說,這種啟動器的固定快捷方式能否成功很大程度跟用戶的操作密切相關(這個可以跟產品吹一波了)。另外可以看到O系統對於服務的嚴格控制,嚴格控制後台服務需要使用前台服務的舉措在於讓應用更加安全(因此 IntentService 在新版本上要慎用。當然谷歌在開發者文檔上針對後台服務這一問題也給了對應的解決辦法),這也看到了谷歌技術團隊對後續版本使用應用安全的決心。

綜上:可以有以下代碼

下面是應用啟動後,Android Studio 自帶 8.0 模擬器,首先創建快捷方式的邏輯順序:

點擊 ADD...以後,我們的應用就顯示這樣了,可以看到快捷方式向衛星一樣掛靠在應用icon 上面:

如果點擊 CANCEL,那麼就沒有創建,退出以後 icon 還是原樣,當我們第二次打開應用,選擇申請桌面快捷方式的時候,又會彈出上面的申請界面。

總結

這篇博客花了一些時間,因為要考慮三種不同情況(如果想要看到三種情況的效果,需要手動更改 minSdkVersion 版本號、以及對應版本的模擬器資源),當然也參考了一些作者的文章。源碼裡面有所有代碼,如果寫的不好或者有任何問題可以直接在評論區或者github 指出。

文章用到的源碼:

https://github.com/zuowutan/ShareShortcut

如果這篇文章對你有幫助,希望各位看官留下寶貴的 star,謝謝。

或者掃一掃關注我的公眾號

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 郭霖 的精彩文章:

Android Studio項目模板全面解析

TAG:郭霖 |