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