Android关照栏增长快捷开关的技能实现

源码 2024-10-3 04:49:23 103 0 来自 中国
1.png 我们通常可以在关照栏上看到“飞行模式”、“移动数据”、“屏幕录制”等开关按钮,这些按钮都属于关照栏上的快捷开关,点击快捷开关可以轻易调用某种体系本领或打开某个应用步伐的特定页面。那是否可以在关照栏上自界说一个快捷开关呢?答案是可以的,详细是通过TileService的方案实现。
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——体现开启或启用状态、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操纵。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 16:21, Processed in 0.147317 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表