Android通知欄增加快捷開(kāi)關(guān)的功能實(shí)現(xiàn)教程
我們通??梢栽谕ㄖ獧谏峡吹?ldquo;飛行模式”、“移動(dòng)數(shù)據(jù)”、“屏幕錄制”等開(kāi)關(guān)按鈕,這些按鈕都屬于通知欄上的快捷開(kāi)關(guān),點(diǎn)擊快捷開(kāi)關(guān)可以輕易調(diào)用某種系統(tǒng)能力或打開(kāi)某個(gè)應(yīng)用程序的特定頁(yè)面。那是否可以在通知欄上自定義一個(gè)快捷開(kāi)關(guān)呢?答案是可以的,具體是通過(guò)TileService的方案實(shí)現(xiàn)。
TileService繼承自Service,所以它也是Android的四大組件之一,不過(guò)它是一個(gè)特殊的組件,開(kāi)發(fā)者不需要手動(dòng)開(kāi)啟調(diào)用,系統(tǒng)可以自動(dòng)識(shí)別并完成調(diào)用,系統(tǒng)會(huì)通過(guò)綁定服務(wù)(bindService)的方式調(diào)用。
創(chuàng)建使用:
快捷開(kāi)關(guān)是Android 7(target 24)的新能力,因此在使用該能力前必須先判斷版本大?。ù笥诘扔趖arget 24)。
1、自定義一個(gè)TileService類(lèi)。
class MyQSTileService: TileService() { ??override?fun?onTileAdded()?{???? super.onTileAdded() } ??override?fun?onStartListening()?{???? super.onStartListening() } ??override?fun?onStopListening()?{???? super.onStopListening() } ??override?fun?onClick()?{???? super.onClick() } ??override?fun?onTileRemoved()?{???? super.onTileRemoved() } }
TileService是通過(guò)綁定服務(wù)(bindService)的方式被調(diào)用的,因此,綁定服務(wù)生命周期包含的四種典型的回調(diào)方法(onCreate()、onBind()、onUnbind()和 onDestroy())都會(huì)被調(diào)用。但是,TileService也包含了以下特殊的生命周期回調(diào)方法:
- onTileAdded():當(dāng)用戶(hù)從編輯欄添加快捷開(kāi)關(guān)到通知欄的快速設(shè)置中會(huì)調(diào)用。
- onTileRemoved():當(dāng)用戶(hù)從通知欄的快速設(shè)置移除快捷開(kāi)關(guān)時(shí)調(diào)用。
- onClick():當(dāng)用戶(hù)點(diǎn)擊快捷開(kāi)關(guān)時(shí)調(diào)用。
- onStartListening():當(dāng)用戶(hù)打開(kāi)通知欄的快速設(shè)置時(shí)調(diào)用。當(dāng)快捷開(kāi)關(guān)并沒(méi)有從編輯欄拖到設(shè)置欄中不會(huì)調(diào)用。在TileAdded添加之后會(huì)調(diào)用一次。
- onStopListening():當(dāng)用戶(hù)打開(kāi)通知欄的快速設(shè)置時(shí)調(diào)用。當(dāng)快捷開(kāi)關(guān)并沒(méi)有從編輯欄拖到設(shè)置欄中不會(huì)調(diào)用。在TileRemoved移除之前會(huì)調(diào)用一次。
2、在應(yīng)用程序的清單文件中聲明TileService。
<service android:name=".MyQSTileService" android:label="@string/my_default_tile_label" android:icon="@drawable/my_default_icon_label" android:exported="true" android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"> <intent-filter> <action android:name="android.service.quicksettings.action.QS_TILE" /> </intent-filter> </service>
- name:自定義的
TileService
的類(lèi)名。 - label:快捷開(kāi)關(guān)在通知欄上顯示的名稱(chēng)。
- icon:快捷開(kāi)關(guān)在通知欄上顯示的圖標(biāo)。
- exported:該服務(wù)能否被外部應(yīng)用調(diào)用。該屬性必須為true。如果為false,那么快捷開(kāi)關(guān)的功能將失效,原因是exported="false"時(shí),
TileService
將不支持外部應(yīng)用調(diào)起,手機(jī)系統(tǒng)自然不能再和該快捷開(kāi)關(guān)交互。必須配置。 - permission:需要給service配置的權(quán)限,BIND_QUICK_SETTINGS_TILE即允許應(yīng)用程序綁定到第三方快速設(shè)置。必須配置。
- intent-filter:意圖過(guò)濾器,只有匹配內(nèi)部的action,才能調(diào)起該service。必須配置。
監(jiān)聽(tīng)模式
TileService的監(jiān)聽(tīng)模式(或理解為啟動(dòng)模式)有兩種,一種是主動(dòng)模式,另一種是標(biāo)準(zhǔn)模式。
- 主動(dòng)模式
在主動(dòng)模式下,TileService被請(qǐng)求時(shí)該服務(wù)會(huì)被綁定,并且TileService的onStartListening也會(huì)被調(diào)用。該模式需要在AndroidManifeast清單文件中聲明:
<service ...> <meta-data android:name="android.service.quicksettings.ACTIVE_TILE" android:value="true" /> ... </service>
通過(guò)TileService.requestListeningState()這一靜態(tài)方法,就可以實(shí)現(xiàn)對(duì)TileService的請(qǐng)求,示例如下:
TileService.requestListeningState( applicationContext, ComponentName( BuildConfig.APPLICATION_ID, MyQSTileService::class.java.name ) )
主動(dòng)模式下值得注意的是:
- 用戶(hù)在通知欄快速設(shè)置的地方點(diǎn)擊快捷開(kāi)關(guān)時(shí),TileService會(huì)自動(dòng)完成綁定、TileService的onStartListening會(huì)被調(diào)用。
- TileService無(wú)論是通過(guò)點(diǎn)擊被綁定還是通過(guò)requestListeningState請(qǐng)求被綁定,TileService所在的進(jìn)程都會(huì)被調(diào)起。
標(biāo)準(zhǔn)模式
在標(biāo)準(zhǔn)模式下,TileService可見(jiàn)時(shí)(即用戶(hù)下拉通知欄看見(jiàn)快捷開(kāi)關(guān))該服務(wù)會(huì)被綁定,并且TileService的onStartListening也會(huì)被調(diào)用。標(biāo)準(zhǔn)模式不需要在AndroidManifeast清單文件中進(jìn)行額外的聲明,默認(rèn)就是標(biāo)準(zhǔn)模式。
標(biāo)準(zhǔn)模式下值得注意的是:
- 和主動(dòng)模式相同,TileService被綁定時(shí),TileService所在的進(jìn)程就會(huì)被調(diào)起。
- 而和主動(dòng)模式不同的是,標(biāo)準(zhǔn)模式綁定TileService是通過(guò)用戶(hù)下拉通知欄實(shí)現(xiàn)的,這意味著TileService所在的進(jìn)程會(huì)被多次調(diào)起。因此為了避免主進(jìn)程被頻繁調(diào)起、避免DAU等數(shù)據(jù)統(tǒng)計(jì)受到影響,我們還需要為T(mén)ileService指定一個(gè)特定的子進(jìn)程,在Androidmanifest清單文件中設(shè)置:
<service ...... android:process="自定義子進(jìn)程的名稱(chēng)"> ...... </service>
更新快捷開(kāi)關(guān)
如果需要對(duì)快捷開(kāi)關(guān)的數(shù)據(jù)進(jìn)行更新,可以通過(guò)getQsTile()獲取快捷開(kāi)關(guān)的對(duì)象,然后通過(guò)setIcon(更新icon)、setLable(更新名稱(chēng))、setState(更新?tīng)顟B(tài),包括STATE_ACTIVE——表示開(kāi)啟或啟用狀態(tài)、STATE_INACTIVE——表示關(guān)閉或暫停狀態(tài)、STATE_UNAVAILABLE:表示暫時(shí)不可用狀態(tài),在此狀態(tài)下,用戶(hù)無(wú)法與您的磁貼交互)等方法設(shè)置快捷開(kāi)關(guān)新的數(shù)據(jù),最后調(diào)用updateTile()方法實(shí)現(xiàn)。
override fun onStartListening() { super.onStartListening() if (qsTile.state === Tile.STATE_ACTIVE) { qsTile.label = "inactive" qsTile.icon = Icon.createWithResource(context, R.drawable.inactive) qsTile.state = Tile.STATE_INACTIVE } else { qsTile.label = "active" qsTile.icon = Icon.createWithResource(context, R.drawable.active) qsTile.state = Tile.STATE_ACTIVE } qsTile.updateTile() }
操作快捷開(kāi)關(guān)
- 如果想要實(shí)現(xiàn)點(diǎn)擊快捷開(kāi)關(guān)時(shí)、關(guān)閉通知欄并跳轉(zhuǎn)到某個(gè)頁(yè)面,可以調(diào)用以下方法:
startActivityAndCollapse(Intent intent)
- 如果想要在點(diǎn)擊快捷開(kāi)關(guān)時(shí)彈出對(duì)話(huà)框進(jìn)行交互,可以調(diào)用以下方法:
override fun onClick() { super.onClick() if(!isLocked()) { showDialog() } }
因?yàn)榭旖蓍_(kāi)關(guān)有可能在用戶(hù)鎖屏?xí)r出現(xiàn),所以必須加上isLocked()的判斷。只有非鎖屏的情況下,對(duì)話(huà)框才會(huì)出現(xiàn)。
- 如果快捷開(kāi)關(guān)含有敏感信息,需要使用isSecure()進(jìn)行設(shè)備安全性判斷,當(dāng)設(shè)備安全時(shí),才能執(zhí)行快捷開(kāi)關(guān)相關(guān)的邏輯(如點(diǎn)擊的邏輯)。當(dāng)設(shè)備不安全時(shí)(手機(jī)處于鎖屏狀態(tài)時(shí)),可調(diào)用unlockAndRun(Runnable runnable),提示用戶(hù)解鎖屏幕并執(zhí)行自定義的runnable操作。
總結(jié)
到此這篇關(guān)于Android通知欄增加快捷開(kāi)關(guān)功能實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Android通知欄增加快捷開(kāi)關(guān)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android videoview搶占焦點(diǎn)的處理方法
這篇文章主要為大家詳細(xì)介紹了Android videoview搶占焦點(diǎn)的處理方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06完美解決android 項(xiàng)目jar包沖突的問(wèn)題
這篇文章主要介紹了完美解決android 項(xiàng)目jar包沖突的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Android實(shí)現(xiàn)點(diǎn)擊縮略圖放大效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)點(diǎn)擊縮略圖放大效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Android 自定View實(shí)現(xiàn)仿QQ運(yùn)動(dòng)步數(shù)圓弧及動(dòng)畫(huà)效果
這篇文章主要介紹了Android自定義view實(shí)現(xiàn)高仿QQ運(yùn)動(dòng)步數(shù)圓弧及動(dòng)畫(huà)效果的實(shí)例代碼,本文涉及到繪制圓弧需要具備的知識(shí)點(diǎn),需要的朋友可以參考下2016-10-10Android獲取監(jiān)聽(tīng)SD卡狀態(tài)
本篇文章主要介紹了Android獲取監(jiān)聽(tīng)SD卡狀態(tài),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03使用TransitionDrawable實(shí)現(xiàn)多張圖片淡入淡出效果
這篇文章主要為大家詳細(xì)介紹了使用TransitionDrawable實(shí)現(xiàn)多張圖片淡入淡出效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08Android學(xué)習(xí)筆記之ContentProvider和Uri詳解
本篇文章主要介紹了Android學(xué)習(xí)筆記之ContentProvider和Uri詳解,對(duì)于學(xué)習(xí)Android的朋友具有一定的參考價(jià)值,有需要可以可以了解一下。2016-11-11Android 自定義LayoutManager實(shí)現(xiàn)花式表格
這篇文章主要介紹了Android 自定義LayoutManager實(shí)現(xiàn)花式表格,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02