您好,登錄后才能下訂單哦!
本篇內容主要講解“Android通知欄增加快捷開關功能如何實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Android通知欄增加快捷開關功能如何實現”吧!
TileService繼承自Service,所以它也是Android的四大組件之一,不過它是一個特殊的組件,開發者不需要手動開啟調用,系統可以自動識別并完成調用,系統會通過綁定服務(bindService)的方式調用。
快捷開關是Android 7(target 24)的新能力,因此在使用該能力前必須先判斷版本大小(大于等于target 24)。
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是通過綁定服務(bindService)的方式被調用的,因此,綁定服務生命周期包含的四種典型的回調方法(onCreate()、onBind()、onUnbind()和 onDestroy())都會被調用。但是,TileService也包含了以下特殊的生命周期回調方法:
onTileAdded():當用戶從編輯欄添加快捷開關到通知欄的快速設置中會調用。
onTileRemoved():當用戶從通知欄的快速設置移除快捷開關時調用。
onClick():當用戶點擊快捷開關時調用。
onStartListening():當用戶打開通知欄的快速設置時調用。當快捷開關并沒有從編輯欄拖到設置欄中不會調用。在TileAdded添加之后會調用一次。
onStopListening():當用戶打開通知欄的快速設置時調用。當快捷開關并沒有從編輯欄拖到設置欄中不會調用。在TileRemoved移除之前會調用一次。
<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:快捷開關在通知欄上顯示的名稱。
icon:快捷開關在通知欄上顯示的圖標。
exported:該服務能否被外部應用調用。該屬性必須為true。如果為false,那么快捷開關的功能將失效,原因是exported="false"時,TileService
將不支持外部應用調起,手機系統自然不能再和該快捷開關交互。必須配置。
permission:需要給service配置的權限,BIND_QUICK_SETTINGS_TILE即允許應用程序綁定到第三方快速設置。必須配置。
intent-filter:意圖過濾器,只有匹配內部的action,才能調起該service。必須配置。
監聽模式
TileService的監聽模式(或理解為啟動模式)有兩種,一種是主動模式,另一種是標準模式。
主動模式
在主動模式下,TileService被請求時該服務會被綁定,并且TileService的onStartListening也會被調用。該模式需要在AndroidManifeast清單文件中聲明:
<service ...> <meta-data android:name="android.service.quicksettings.ACTIVE_TILE" android:value="true" /> ... </service>
通過TileService.requestListeningState()這一靜態方法,就可以實現對TileService的請求,示例如下:
TileService.requestListeningState( applicationContext, ComponentName( BuildConfig.APPLICATION_ID, MyQSTileService::class.java.name ) )
主動模式下值得注意的是:
用戶在通知欄快速設置的地方點擊快捷開關時,TileService會自動完成綁定、TileService的onStartListening會被調用。
TileService無論是通過點擊被綁定還是通過requestListeningState請求被綁定,TileService所在的進程都會被調起。
標準模式
在標準模式下,TileService可見時(即用戶下拉通知欄看見快捷開關)該服務會被綁定,并且TileService的onStartListening也會被調用。標準模式不需要在AndroidManifeast清單文件中進行額外的聲明,默認就是標準模式。
標準模式下值得注意的是:
和主動模式相同,TileService被綁定時,TileService所在的進程就會被調起。
而和主動模式不同的是,標準模式綁定TileService是通過用戶下拉通知欄實現的,這意味著TileService所在的進程會被多次調起。因此為了避免主進程被頻繁調起、避免DAU等數據統計受到影響,我們還需要為TileService指定一個特定的子進程,在Androidmanifest清單文件中設置:
<service ...... android:process="自定義子進程的名稱"> ...... </service>
更新快捷開關
如果需要對快捷開關的數據進行更新,可以通過getQsTile()獲取快捷開關的對象,然后通過setIcon(更新icon)、setLable(更新名稱)、setState(更新狀態,包括STATE_ACTIVE——表示開啟或啟用狀態、STATE_INACTIVE——表示關閉或暫停狀態、STATE_UNAVAILABLE:表示暫時不可用狀態,在此狀態下,用戶無法與您的磁貼交互)等方法設置快捷開關新的數據,最后調用updateTile()方法實現。
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() }
操作快捷開關
如果想要實現點擊快捷開關時、關閉通知欄并跳轉到某個頁面,可以調用以下方法:
startActivityAndCollapse(Intent intent)
如果想要在點擊快捷開關時彈出對話框進行交互,可以調用以下方法:
override fun onClick() { super.onClick() if(!isLocked()) { showDialog() } }
因為快捷開關有可能在用戶鎖屏時出現,所以必須加上isLocked()的判斷。只有非鎖屏的情況下,對話框才會出現。
如果快捷開關含有敏感信息,需要使用isSecure()進行設備安全性判斷,當設備安全時,才能執行快捷開關相關的邏輯(如點擊的邏輯)。當設備不安全時(手機處于鎖屏狀態時),可調用unlockAndRun(Runnable runnable),提示用戶解鎖屏幕并執行自定義的runnable操作。
到此,相信大家對“Android通知欄增加快捷開關功能如何實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。