中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android通知欄增加快捷開關功能如何實現

發布時間:2023-02-01 09:53:21 來源:億速云 閱讀:117 作者:iii 欄目:開發技術

本篇內容主要講解“Android通知欄增加快捷開關功能如何實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Android通知欄增加快捷開關功能如何實現”吧!

    TileService繼承自Service,所以它也是Android的四大組件之一,不過它是一個特殊的組件,開發者不需要手動開啟調用,系統可以自動識別并完成調用,系統會通過綁定服務(bindService)的方式調用。

    創建使用:

    快捷開關是Android 7(target 24)的新能力,因此在使用該能力前必須先判斷版本大小(大于等于target 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是通過綁定服務(bindService)的方式被調用的,因此,綁定服務生命周期包含的四種典型的回調方法(onCreate()、onBind()、onUnbind()和 onDestroy())都會被調用。但是,TileService也包含了以下特殊的生命周期回調方法:

    • onTileAdded():當用戶從編輯欄添加快捷開關到通知欄的快速設置中會調用。

    • onTileRemoved():當用戶從通知欄的快速設置移除快捷開關時調用。

    • onClick():當用戶點擊快捷開關時調用。

    • onStartListening():當用戶打開通知欄的快速設置時調用。當快捷開關并沒有從編輯欄拖到設置欄中不會調用。在TileAdded添加之后會調用一次。

    • onStopListening():當用戶打開通知欄的快速設置時調用。當快捷開關并沒有從編輯欄拖到設置欄中不會調用。在TileRemoved移除之前會調用一次。

    2、在應用程序的清單文件中聲明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:快捷開關在通知欄上顯示的名稱。

    • 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&mdash;&mdash;表示開啟或啟用狀態、STATE_INACTIVE&mdash;&mdash;表示關閉或暫停狀態、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通知欄增加快捷開關功能如何實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    望奎县| 长沙市| 边坝县| 航空| 休宁县| 临沧市| 滦南县| 临清市| 安西县| 安平县| 诸城市| 县级市| 巴中市| 新兴县| 平塘县| 台东县| 常熟市| 绍兴市| 和林格尔县| 宁乡县| 临清市| 灯塔市| 宜兰市| 青川县| 寻乌县| 承德市| 洱源县| 江口县| 四子王旗| 福贡县| 柳州市| 文安县| 莲花县| 屯昌县| 平乐县| 博乐市| 霍林郭勒市| 寿宁县| 商河县| 泾阳县| 镇远县|