我们通常可以在通知栏上看到“飞行模式”、“移动数据”、“屏幕录制”等开关按钮,这些按钮都属于通知栏上的快捷开关,点击快捷开关可以轻易调用某种系统能力或打开某个应用程序的特定页面。那是否可以在通知栏上自定义一个快捷开关呢?答案是可以的,具体是通过TileService的方案实现。
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也包含了以下特殊的生命周期回调方法:
<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>
TileService
的类名。TileService
将不支持外部应用调起,手机系统自然不能再和该快捷开关交互。必须配置。监听模式
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也会被调用。标准模式不需要在AndroidManifeast清单文件中进行额外的声明,默认就是标准模式。
标准模式下值得注意的是:
<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()的判断。只有非锁屏的情况下,对话框才会出现。
到此这篇关于Android通知栏增加快捷开关功能实现的文章就介绍到这了,更多相关Android通知栏增加快捷开关内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
编程 | 2023-02-24 21:36
编程 | 2023-02-21 12:51
编程 | 2023-02-21 12:47
编程 | 2023-02-21 00:15
编程 | 2023-02-21 00:08
编程 | 2023-02-20 21:46
编程 | 2023-02-20 21:42
编程 | 2023-02-20 21:36
编程 | 2023-02-20 21:32
编程 | 2023-02-20 18:12
网友评论