Android App桌面長(zhǎng)按菜單展示快捷操作

[轉(zhuǎn)載文章]

長(zhǎng)按桌面圖標(biāo)展示快捷方式,今時(shí)看來(lái)温兼,早已司空見慣秸滴,一是Android很早的版本就已經(jīng)支持,二是大部分的應(yīng)用也已經(jīng)實(shí)現(xiàn)募判,像微信荡含,支付寶,頭條等届垫,所以無(wú)論功能還是實(shí)現(xiàn)方式释液,都已經(jīng)踴躍出了大量的技術(shù)博文,但細(xì)細(xì)看去装处,卻很少有一個(gè)統(tǒng)一的流程及具體的實(shí)現(xiàn)方案误债,本文針對(duì)此功能做了細(xì)致的總結(jié),一是妄迁,便于日后開發(fā)的需要寝蹈,二是,希望可以幫助到有類似需求的小伙伴登淘。

這個(gè)特性躺盛,可以追溯到Android 7.1,也就是在7.1之后的系統(tǒng)形帮,如果app支持槽惫,可以通過長(zhǎng)按app圖標(biāo)展示一些快捷操作,如下圖:


相信上圖中的功能辩撑,大家都見過界斜,那么如何實(shí)現(xiàn)呢?Android API當(dāng)中給出了兩種實(shí)現(xiàn)方式合冀,一種是靜態(tài)各薇,一種是動(dòng)態(tài)。

靜態(tài)方式:

靜態(tài)的方式君躺,需要xml資源峭判,以shortcuts標(biāo)簽的形式引入,字面意思我們顯而易見棕叫,就是捷徑標(biāo)簽林螃。

簡(jiǎn)單兩步就可以實(shí)現(xiàn),第一步俺泣,在res目錄下疗认,新建xml目錄完残,然后創(chuàng)建對(duì)應(yīng)的xml資源。


<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">

    <shortcut
        android:enabled="true"
        android:icon="@mipmap/ic_launcher"
        android:shortcutId="test_0"
        android:shortcutShortLabel="@string/app_test_0">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.abner.widget.Test0Activity"
            android:targetPackage="com.abner.widget" />
        <categories android:name="android.shortcut.conversation" />
        <capability-binding android:key="actions.intent.CREATE_MESSAGE" />
    </shortcut>

    <shortcut
        android:enabled="true"
        android:icon="@mipmap/ic_launcher"
        android:shortcutId="test_1"
        android:shortcutShortLabel="@string/app_test_1">
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.abner.widget.Test1Activity"
            android:targetPackage="com.abner.widget" />
        <categories android:name="android.shortcut.conversation" />
        <capability-binding android:key="actions.intent.CREATE_MESSAGE" />
    </shortcut>
</shortcuts>

外層首先一個(gè)shortcuts標(biāo)簽, 里面就是包裹著一個(gè)一個(gè)快捷方式shortcut横漏,你需要幾個(gè)谨设,就創(chuàng)建幾個(gè),上面代碼中我是創(chuàng)建了兩個(gè)缎浇,可以發(fā)現(xiàn)這些屬性和我們清單文件里的Activity里的屬性類似扎拣,這里簡(jiǎn)單概述一下:

enabled, 表示這個(gè)shortcut是否可用
icon 為快捷圖標(biāo)
shortcutId, 快捷方式唯一的id
shortcutShortLabel, 短名稱
shortcutLongLabel, 這里是配置的長(zhǎng)名稱, launcher會(huì)優(yōu)先選擇長(zhǎng)名稱顯示,顯示不下會(huì)選擇短名稱
categories 為應(yīng)用程序的快捷方式執(zhí)行的操作類型提供分組素跺,例如創(chuàng)建新的聊天消息
capability-binding 可選 聲明與此快捷方式關(guān)聯(lián)的功能鹏秋。CREATE_MESSAGE 聲明的功能,是與應(yīng)用有關(guān)的 Action 內(nèi)置 intent亡笑。用戶可以結(jié)合使用語(yǔ)音指令與 Google 助理來(lái)調(diào)用此快捷方式侣夷。

在shortcut標(biāo)簽下,還有一個(gè)intent標(biāo)簽,不用說(shuō)仑乌,想必大家也知道了它的作用百拓,就是點(diǎn)擊快捷方式,跳轉(zhuǎn)的目標(biāo)晰甚。

intent, 這里表示我們點(diǎn)擊shortcut時(shí)要干嘛,
targetPackage是指定一個(gè)目標(biāo)應(yīng)用的包名,
targetClass是我們要跳轉(zhuǎn)的目標(biāo)類, 這里要注意的是android:action一定要配置, 否則會(huì)崩潰
categories, 這個(gè)東西目前位置官方只給提供了android.shortcut.conversation

第二步衙传,清單文件AndroidManifest里進(jìn)行配置,這個(gè)需要注意一下:只能在有action是android.intent.action.MAIN和category是android.intent.category.LAUNCHER的Activity中配置才有效厕九,說(shuō)簡(jiǎn)單點(diǎn)蓖捶,也就是應(yīng)用的主入口。

<!--引入shortcuts資源-->
<meta-data
    android:name="android.app.shortcuts"
    android:resource="@xml/shortcuts" />

以上兩步完成之后扁远,我們就可以運(yùn)行程序俊鱼,效果如下:


動(dòng)態(tài)方式:

上述的過程,我們實(shí)現(xiàn)了靜態(tài)的快捷方式畅买,但常見的需求情況下并闲,有很多是需要?jiǎng)討B(tài)配置的,那么如何實(shí)現(xiàn)呢谷羞?其實(shí)也非常簡(jiǎn)單帝火,目前動(dòng)態(tài)的方式創(chuàng)建其中,也有兩種代碼方式湃缎,一種是通過ShortcutManagerCompat來(lái)實(shí)現(xiàn)犀填,一種是ShortcutManager,兩種方式大同小異嗓违,我們一起來(lái)看下:

ShortcutManagerCompat方式實(shí)現(xiàn):
添加:

//動(dòng)態(tài)方式添加一
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
    val shortScan = ShortcutInfoCompat.Builder(this, "test_2")//唯一標(biāo)識(shí)id
        .setShortLabel(getString(R.string.app_test_2))//短標(biāo)簽
        .setIcon(IconCompat.createWithResource(this, R.mipmap.ic_launcher))//圖標(biāo)
        //跳轉(zhuǎn)的目標(biāo)九巡,定義Activity
        .setIntent(Intent(Intent.ACTION_MAIN, null, this, MainActivity::class.java))
        .build()
    //執(zhí)行添加操作
    ShortcutManagerCompat.addDynamicShortcuts(this, mutableListOf(shortScan))

    toast("已添加")
}

添加后效果對(duì)比


更新:

//動(dòng)態(tài)更新方式一
val shortScan = ShortcutInfoCompat.Builder(this, "test_2")//唯一標(biāo)識(shí)id
    .setShortLabel(getString(R.string.app_test_2_updata))//更新一個(gè)短標(biāo)簽
    .setIcon(IconCompat.createWithResource(this, R.mipmap.ic_launcher))//圖標(biāo)
    //要跳轉(zhuǎn)的目標(biāo)
    .setIntent(Intent(Intent.ACTION_MAIN, null, this, MainActivity::class.java))
    .build()
//執(zhí)行更新操作
ShortcutManagerCompat.updateShortcuts(this, mutableListOf(shortScan))

toast("已更新")

更新前后效果對(duì)比

刪除:

//動(dòng)態(tài)移除方式一
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
    ShortcutManagerCompat.removeDynamicShortcuts(
        this@MainActivity,
        Collections.singletonList("test_2")//唯一標(biāo)識(shí)id
    )
    toast("已移除")
}

刪除后效果

ShortcutManager方式實(shí)現(xiàn):
添加:

//動(dòng)態(tài)方式添加二
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
    val info = ShortcutInfo.Builder(this, "test_3")//唯一標(biāo)識(shí)id
        .setShortLabel(getString(R.string.app_test_3))//短的標(biāo)簽
        .setLongLabel(getString(R.string.app_test_3_long))//長(zhǎng)的標(biāo)簽
        .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))//圖標(biāo)
        .setIntent(intent)//跳轉(zhuǎn)的目標(biāo),這里我設(shè)置的是當(dāng)前
        .build()
    //執(zhí)行添加操作
    getSystemService(ShortcutManager::class.java)
        .dynamicShortcuts = mutableListOf(info)

    toast("已添加")
}

刪除:

//動(dòng)態(tài)移除方式二
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
    getSystemService(ShortcutManager::class.java)
        .removeDynamicShortcuts(listOf("test_3"))//唯一的id標(biāo)識(shí)
    toast("已移除")
}

更新:

//動(dòng)態(tài)更新方式二
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
    val info = ShortcutInfo.Builder(this, "test_3")//唯一標(biāo)識(shí)id
        .setShortLabel(getString(R.string.app_test_3_updata))//更新一個(gè)短標(biāo)簽
        .setLongLabel(getString(R.string.app_test_3_long))//長(zhǎng)標(biāo)簽
        .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher))//圖標(biāo)
        .setIntent(intent)//跳轉(zhuǎn)的目標(biāo)靠瞎,這里我設(shè)置的是當(dāng)前
        .build()
    //執(zhí)行更新操作
    getSystemService(ShortcutManager::class.java).updateShortcuts(listOf(info))

    toast("已更新")
}

上述的代碼中比庄,注釋已經(jīng)很清楚了求妹,這里就不細(xì)講乏盐,效果呢和第一種方式類似佳窑,這里就不貼效果了,大家感興趣的話父能,可以直接看源碼神凑,地址是:
https://github.com/AbnerMing888/AndroidWidget

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市何吝,隨后出現(xiàn)的幾起案子溉委,更是在濱河造成了極大的恐慌,老刑警劉巖爱榕,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓣喊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡黔酥,警方通過查閱死者的電腦和手機(jī)藻三,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)跪者,“玉大人棵帽,你說(shuō)我怎么就攤上這事≡幔” “怎么了逗概?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)忘衍。 經(jīng)常有香客問我逾苫,道長(zhǎng),這世上最難降的妖魔是什么枚钓? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任隶垮,我火速辦了婚禮,結(jié)果婚禮上秘噪,老公的妹妹穿的比我還像新娘狸吞。我一直安慰自己,他們只是感情好指煎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布蹋偏。 她就那樣靜靜地躺著,像睡著了一般至壤。 火紅的嫁衣襯著肌膚如雪威始。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天像街,我揣著相機(jī)與錄音黎棠,去河邊找鬼晋渺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脓斩,可吹牛的內(nèi)容都是我干的木西。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼随静,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼八千!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起燎猛,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恋捆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后重绷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沸停,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年昭卓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了愤钾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡葬凳,死狀恐怖绰垂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情火焰,我是刑警寧澤劲装,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站昌简,受9級(jí)特大地震影響占业,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纯赎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一谦疾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧犬金,春花似錦念恍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至该默,卻和暖如春瞳氓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背栓袖。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工匣摘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留店诗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓音榜,卻偏偏與公主長(zhǎng)得像庞瘸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子囊咏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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