android通知栏快捷设置开发,即添加快捷磁贴指北
16lz
2021-01-23
android通知栏快捷设置开发,即添加快捷磁贴指北
针对通知栏快捷磁贴开发,Google提供了公开服务快捷设置,可以看到开发者可以通过使用此服务完成快捷开发.
此服务依赖于android N(API24)
下面进入正文
-
首先创建服务继承TileService
package com.mml.oneplus.nh.serviceimport android.annotation.SuppressLintimport android.graphics.drawable.Iconimport android.service.quicksettings.Tileimport android.service.quicksettings.TileServiceimport com.mml.oneplus.nh.Rimport com.mml.oneplus.nh.util.logimport com.mml.oneplus.nh.util.showDebugToast@SuppressLint("NewApi")class QuickStartTileService : TileService() { companion object { const val TAG = "QuickStartTileService" } //当用户从Edit栏添加到快速设置中调用 override fun onTileAdded() { super.onTileAdded() showDebugToast(context = applicationContext, msg = "onTileAdded") log("onTileAdded", TAG) } //当用户从快速设置栏中移除的时候调用 override fun onTileRemoved() { super.onTileRemoved() log("onTileRemoved", TAG) } // 点击的时候 /* 我们可以通过getQsTile来获得Tile对象,通过getState() 来获得Tile当前状态。 - STATE_ACTIVE 开启状态 - STATE_INACTIVE 关闭状态 - STATE_UNAVAILABLE 非可点击状态 最后必须调用updateTile() 来触发刷新*/ override fun onClick() { super.onClick() log("onClick", TAG) val state = qsTile.state log(tag = TAG, msg = "onClick state = " + qsTile.state.toString()) var icon: Icon = Icon.createWithResource(applicationContext, R.drawable.ic_message) when (state) { Tile.STATE_INACTIVE -> {// icon = Icon.createWithResource(applicationContext, R.drawable.logo_qq) qsTile.state = Tile.STATE_ACTIVE// 更改成活跃状态 showDebugToast(applicationContext, "STATE_INACTIVE to STATE_ACTIVE") startOrShowNotification() } Tile.STATE_ACTIVE -> {// icon = Icon.createWithResource(applicationContext, R.drawable.logo_wechat) qsTile.state = Tile.STATE_INACTIVE//更改成非活跃状态 showDebugToast(applicationContext, "STATE_ACTIVE to STATE_INACTIVE") cancelNotification() } Tile.STATE_UNAVAILABLE -> {// icon = Icon.createWithResource(applicationContext, R.drawable.ic_noti_action_cancel) } } qsTile.icon = icon//设置图标 qsTile.updateTile()//更新Tile } private fun cancelNotification() { if (NotificationService.isStart) { NotificationService.sendAction( applicationContext, NotificationService.ACTION_SERVICE_NOTI_HIDE ) } } private fun startOrShowNotification() { if (!NotificationService.isStart) { NotificationService.startService(applicationContext) } else { if (!NotificationService.isShowed) { NotificationService.sendAction( applicationContext, NotificationService.ACTION_SERVICE_NOTI_SHOW ) } } } // 打开下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用 //在TleAdded之后会调用一次 override fun onStartListening() { super.onStartListening() log("onStartListening", TAG) } // 关闭下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用 // 在onTileRemoved移除之前也会调用移除 override fun onStopListening() { super.onStopListening() log("onStopListening", TAG) }}
-
在mainfast声明服务
注意,服务声明时必须指定label和icon
<service android:name=".QuickStartTileService" android:label="@string/my_default_tile_label" android:icon="@drawable/my_default_icon_label" android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"> <intent-filter> <action android:name="android.service.quicksettings.action.QS_TILE" /> intent-filter> <meta-data android:name="android.service.quicksettings.ACTIVE_TILE" android:value="true" /> service>
应用
-
生命周期介绍
法名 功能 onTileAdded() 当用户从Edit栏添加到快速设置中调用 onTileRemoved() 当用户从快速设置区域移除一个Tile时调用,这里不要做有关于此Tile的任何操作。 onStartListening() 打开下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用,在TleAdded之后会调用一次 onStopListening() 关闭下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用,在onTileRemoved移除之前也会调用移除 onClick() 点击磁贴时调用,我们可以通过getQsTile来获得Tile对象,通过getState() 来获得Tile当前状态。- STATE_ACTIVE: 开启状态- STATE_INACTIVE: 关闭状态 - STATE_UNAVAILABLE: 非可点击状态,最后必须调用updateTile() 来触发刷新 -
主动调用
需要在声明处调用
然后即可在代码中通过TileService.requestListeningState(this, ComponentName( BuildConfig.APPLICATION_ID, QuickStartTileService::class.java.name ))
激活服务 -
重写长按磁贴逻辑
默认长按磁贴逻辑为跳转到app详情界面,如果需要重写逻辑只需要在相应activity声明处添加一个action过滤即可
在
添加如下代码
多个tileService,分别长按时执行相应的逻辑
默认的tileservice长按是打开appinfo界面,可以通过添加上面代码实现重写长按逻辑,但是会有一个问题是,如果有多个tileservice时,长按会到同一个处理界面,这就要分别执行不同的长按逻辑,这一点官方文档指出,service会携带一个 Intent#EXTRA_COMPONENT_NAME 标识他从哪个tileservice来,所以根据它进行单独处理.
- 处理tileservice长按事件
-
首先定一个长按接口
interface TileServiceLongClick { fun onLongClick()}
-
定义tileservice,继承长按接口
@SuppressLint("NewApi")class QuickStartTileService : TileService(),TileServiceLongClick { companion object { const val TAG = "QuickStartTileService" } //当用户从Edit栏添加到快速设置中调用 override fun onTileAdded() { super.onTileAdded() showDebugToast(context = applicationContext, msg = "onTileAdded") log("onTileAdded", TAG) } //当用户从快速设置栏中移除的时候调用 override fun onTileRemoved() { super.onTileRemoved() log("onTileRemoved", TAG) } // 点击的时候 /* 我们可以通过getQsTile来获得Tile对象,通过getState() 来获得Tile当前状态。 - STATE_ACTIVE 开启状态 - STATE_INACTIVE 关闭状态 - STATE_UNAVAILABLE 非可点击状态 最后必须调用updateTile() 来触发刷新*/ override fun onClick() { super.onClick() log("onClick", TAG) val state = qsTile.state log(tag = TAG, msg = "onClick state = " + qsTile.state.toString()) var icon: Icon = Icon.createWithResource(applicationContext, R.drawable.ic_message) when (state) { Tile.STATE_INACTIVE -> {// icon = Icon.createWithResource(applicationContext, R.drawable.logo_qq) qsTile.state = Tile.STATE_ACTIVE// 更改成活跃状态 showDebugToast(applicationContext, "STATE_INACTIVE to STATE_ACTIVE") } Tile.STATE_ACTIVE -> {// icon = Icon.createWithResource(applicationContext, R.drawable.logo_wechat) qsTile.state = Tile.STATE_INACTIVE//更改成非活跃状态 showDebugToast(applicationContext, "STATE_ACTIVE to STATE_INACTIVE") } Tile.STATE_UNAVAILABLE -> {// icon = Icon.createWithResource(applicationContext, R.drawable.ic_noti_action_cancel) } } qsTile.icon = icon//设置图标 qsTile.updateTile()//更新Tile } // 打开下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用 //在TleAdded之后会调用一次 override fun onStartListening() { super.onStartListening() log("onStartListening", TAG) } // 关闭下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用 // 在onTileRemoved移除之前也会调用移除 override fun onStopListening() { super.onStopListening() log("onStopListening", TAG) } override fun onLongClick(){ //通知栏快捷图快打开默认是常显示通知,可在设置更改 }}
-
在对应接收长按事件的activity进行判断
获取到来源以后便通过反射调用onlongclick方法
class QuickLaunchServiceActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.O) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //长按通知栏快捷图标 直接启动服务 if (intent.action == TileService.ACTION_QS_TILE_PREFERENCES) { val componentName =intent.extras?.get(Intent.EXTRA_COMPONENT_NAME) as ComponentName? componentName?:return Class.forName(componentName.className).newInstance().apply { if (this is TileServiceLongClick) { onLongClick() } } } finish() }}
-
更多相关文章
- android studio 2.0 按钮点击切换样式示例
- Android StaggeredGridLayoutManager布局RecyclerView在滚动状态
- 解决软键盘弹出,同时把底部按钮顶上去问题
- android输入法状态控制
- Android小例子(点击一个按钮,传递数据给另一个页面)
- Android顶部菜单栏,返回按钮、标题布局、右上角菜单
- Android控件笔记——多状态按钮ToggleButton
- Android 沉浸式状态栏,别搞那么麻烦
- 【样式问题】react native Android 键盘将底部导航栏/按钮顶起