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類。
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)用戶從編輯欄添加快捷開(kāi)關(guān)到通知欄的快速設(shè)置中會(huì)調(diào)用。
- onTileRemoved():當(dāng)用戶從通知欄的快速設(shè)置移除快捷開(kāi)關(guān)時(shí)調(diào)用。
- onClick():當(dāng)用戶點(diǎn)擊快捷開(kāi)關(guān)時(shí)調(diào)用。
- onStartListening():當(dāng)用戶打開(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)用戶打開(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的類名。 - label:快捷開(kāi)關(guān)在通知欄上顯示的名稱。
- 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)模式下值得注意的是:
- 用戶在通知欄快速設(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í)(即用戶下拉通知欄看見(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ò)用戶下拉通知欄實(shí)現(xiàn)的,這意味著TileService所在的進(jìn)程會(huì)被多次調(diào)起。因此為了避免主進(jìn)程被頻繁調(diào)起、避免DAU等數(shù)據(jù)統(tǒng)計(jì)受到影響,我們還需要為TileService指定一個(gè)特定的子進(jìn)程,在Androidmanifest清單文件中設(shè)置:
<service
......
android:process="自定義子進(jìn)程的名稱">
......
</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(更新名稱)、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)下,用戶無(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ì)話框進(jìn)行交互,可以調(diào)用以下方法:
override fun onClick() {
super.onClick()
if(!isLocked()) {
showDialog()
}
}因?yàn)榭旖蓍_(kāi)關(guān)有可能在用戶鎖屏?xí)r出現(xiàn),所以必須加上isLocked()的判斷。只有非鎖屏的情況下,對(duì)話框才會(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),提示用戶解鎖屏幕并執(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編程使WebView支持HTML5 Video全屏播放的解決方法
這篇文章主要介紹了Android編程使WebView支持HTML5 Video全屏播放的解決方法,較為詳細(xì)的分析了全屏播放所涉及的相關(guān)技巧,并給出了完整代碼下載地址供讀者參考,需要的朋友可以參考下2015-10-10
Android如何通過(guò)手機(jī)獲取驗(yàn)證碼來(lái)完成注冊(cè)功能
注冊(cè)app或者網(wǎng)絡(luò)帳號(hào)的時(shí)候,經(jīng)常需要手機(jī)獲取驗(yàn)證碼,來(lái)完成注冊(cè)功能,那么android如何通過(guò)手機(jī)獲取驗(yàn)證碼來(lái)完成注冊(cè)功能,代碼是怎么實(shí)現(xiàn)的呢?下面看看小編給大家?guī)Я说囊欢未a分析吧2015-11-11
Android實(shí)現(xiàn)文字上下滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)文字上下滾動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Android 中使用RadioGroup和Fragment實(shí)現(xiàn)底部導(dǎo)航欄的功能
這篇文章主要介紹了Android 中使用RadioGroup+Fragment實(shí)現(xiàn)底部導(dǎo)航欄的功能,整體文章大概分為兩部分介紹,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-06-06
Android 自定義gradle property詳解及實(shí)例代碼
這篇文章主要介紹了Android 自定義gradle property詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
Android中Fragment 重疊遮蓋問(wèn)題解決辦法
這篇文章主要介紹了Android中Fragment 重疊遮蓋問(wèn)題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-05-05

