Android通知欄增加快捷開關(guān)的功能實現(xiàn)教程

我們通??梢栽谕ㄖ獧谏峡吹?ldquo;飛行模式”、“移動數(shù)據(jù)”、“屏幕錄制”等開關(guān)按鈕,這些按鈕都屬于通知欄上的快捷開關(guān),點擊快捷開關(guān)可以輕易調(diào)用某種系統(tǒng)能力或打開某個應(yīng)用程序的特定頁面。那是否可以在通知欄上自定義一個快捷開關(guān)呢?答案是可以的,具體是通過TileService的方案實現(xiàn)。
TileService繼承自Service,所以它也是Android的四大組件之一,不過它是一個特殊的組件,開發(fā)者不需要手動開啟調(diào)用,系統(tǒng)可以自動識別并完成調(diào)用,系統(tǒng)會通過綁定服務(wù)(bindService)的方式調(diào)用。
創(chuàng)建使用:
快捷開關(guān)是Android 7(target 24)的新能力,因此在使用該能力前必須先判斷版本大?。ù笥诘扔趖arget 24)。
1、自定義一個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():當用戶從編輯欄添加快捷開關(guān)到通知欄的快速設(shè)置中會調(diào)用。
- onTileRemoved():當用戶從通知欄的快速設(shè)置移除快捷開關(guān)時調(diào)用。
- onClick():當用戶點擊快捷開關(guān)時調(diào)用。
- onStartListening():當用戶打開通知欄的快速設(shè)置時調(diào)用。當快捷開關(guān)并沒有從編輯欄拖到設(shè)置欄中不會調(diào)用。在TileAdded添加之后會調(diào)用一次。
- onStopListening():當用戶打開通知欄的快速設(shè)置時調(diào)用。當快捷開關(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)在通知欄上顯示的圖標。
- exported:該服務(wù)能否被外部應(yīng)用調(diào)用。該屬性必須為true。如果為false,那么快捷開關(guān)的功能將失效,原因是exported="false"時,
TileService將不支持外部應(yīng)用調(diào)起,手機系統(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)聽模式(或理解為啟動模式)有兩種,一種是主動模式,另一種是標準模式。
- 主動模式
在主動模式下,TileService被請求時該服務(wù)會被綁定,并且TileService的onStartListening也會被調(diào)用。該模式需要在AndroidManifeast清單文件中聲明:
<service ...>
<meta-data android:name="android.service.quicksettings.ACTIVE_TILE"
android:value="true" />
...
</service>通過TileService.requestListeningState()這一靜態(tài)方法,就可以實現(xiàn)對TileService的請求,示例如下:
TileService.requestListeningState(
applicationContext, ComponentName(
BuildConfig.APPLICATION_ID,
MyQSTileService::class.java.name
)
)主動模式下值得注意的是:
- 用戶在通知欄快速設(shè)置的地方點擊快捷開關(guān)時,TileService會自動完成綁定、TileService的onStartListening會被調(diào)用。
- TileService無論是通過點擊被綁定還是通過requestListeningState請求被綁定,TileService所在的進程都會被調(diào)起。
標準模式
在標準模式下,TileService可見時(即用戶下拉通知欄看見快捷開關(guān))該服務(wù)會被綁定,并且TileService的onStartListening也會被調(diào)用。標準模式不需要在AndroidManifeast清單文件中進行額外的聲明,默認就是標準模式。
標準模式下值得注意的是:
- 和主動模式相同,TileService被綁定時,TileService所在的進程就會被調(diào)起。
- 而和主動模式不同的是,標準模式綁定TileService是通過用戶下拉通知欄實現(xiàn)的,這意味著TileService所在的進程會被多次調(diào)起。因此為了避免主進程被頻繁調(diào)起、避免DAU等數(shù)據(jù)統(tǒng)計受到影響,我們還需要為TileService指定一個特定的子進程,在Androidmanifest清單文件中設(shè)置:
<service
......
android:process="自定義子進程的名稱">
......
</service>更新快捷開關(guān)
如果需要對快捷開關(guān)的數(shù)據(jù)進行更新,可以通過getQsTile()獲取快捷開關(guān)的對象,然后通過setIcon(更新icon)、setLable(更新名稱)、setState(更新狀態(tài),包括STATE_ACTIVE——表示開啟或啟用狀態(tài)、STATE_INACTIVE——表示關(guān)閉或暫停狀態(tài)、STATE_UNAVAILABLE:表示暫時不可用狀態(tài),在此狀態(tài)下,用戶無法與您的磁貼交互)等方法設(shè)置快捷開關(guān)新的數(shù)據(jù),最后調(diào)用updateTile()方法實現(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)
- 如果想要實現(xiàn)點擊快捷開關(guān)時、關(guān)閉通知欄并跳轉(zhuǎn)到某個頁面,可以調(diào)用以下方法:
startActivityAndCollapse(Intent intent)
- 如果想要在點擊快捷開關(guān)時彈出對話框進行交互,可以調(diào)用以下方法:
override fun onClick() {
super.onClick()
if(!isLocked()) {
showDialog()
}
}因為快捷開關(guān)有可能在用戶鎖屏?xí)r出現(xiàn),所以必須加上isLocked()的判斷。只有非鎖屏的情況下,對話框才會出現(xiàn)。
- 如果快捷開關(guān)含有敏感信息,需要使用isSecure()進行設(shè)備安全性判斷,當設(shè)備安全時,才能執(zhí)行快捷開關(guān)相關(guān)的邏輯(如點擊的邏輯)。當設(shè)備不安全時(手機處于鎖屏狀態(tài)時),可調(diào)用unlockAndRun(Runnable runnable),提示用戶解鎖屏幕并執(zhí)行自定義的runnable操作。
總結(jié)
到此這篇關(guān)于Android通知欄增加快捷開關(guān)功能實現(xiàn)的文章就介紹到這了,更多相關(guān)Android通知欄增加快捷開關(guān)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android編程使WebView支持HTML5 Video全屏播放的解決方法
這篇文章主要介紹了Android編程使WebView支持HTML5 Video全屏播放的解決方法,較為詳細的分析了全屏播放所涉及的相關(guān)技巧,并給出了完整代碼下載地址供讀者參考,需要的朋友可以參考下2015-10-10
Android 中使用RadioGroup和Fragment實現(xiàn)底部導(dǎo)航欄的功能
這篇文章主要介紹了Android 中使用RadioGroup+Fragment實現(xiàn)底部導(dǎo)航欄的功能,整體文章大概分為兩部分介紹,通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2021-06-06
Android 自定義gradle property詳解及實例代碼
這篇文章主要介紹了Android 自定義gradle property詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02

