android通知栏快捷设置开发,即添加快捷磁贴指北

针对通知栏快捷磁贴开发,Google提供了公开服务快捷设置,可以看到开发者可以通过使用此服务完成快捷开发.
此服务依赖于android N(API24)
android通知栏快捷设置开发,即添加快捷磁贴指北_第1张图片
下面进入正文


  • 首先创建服务继承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()    }}

更多相关文章

  1. android studio 2.0 按钮点击切换样式示例
  2. Android StaggeredGridLayoutManager布局RecyclerView在滚动状态
  3. 解决软键盘弹出,同时把底部按钮顶上去问题
  4. android输入法状态控制
  5. Android小例子(点击一个按钮,传递数据给另一个页面)
  6. Android顶部菜单栏,返回按钮、标题布局、右上角菜单
  7. Android控件笔记——多状态按钮ToggleButton
  8. Android 沉浸式状态栏,别搞那么麻烦
  9. 【样式问题】react native Android 键盘将底部导航栏/按钮顶起

随机推荐

  1. 这种方式教你简单的在Flutter中分离View
  2. android apk 源码 的 破译(反编译)
  3. Android编译系统环境初始化过程分析
  4. 【Andriod】Andriod-Opencv 实现一些简单
  5. android序列化笔记
  6. Mac电脑 android studio真机调试操作步骤
  7. Android之旅十五 android中的网络操作
  8. Android(安卓)软件开发规范说明
  9. Android(java方法)上实现mp4的分割和拼接
  10. 关于Android的多种屏幕支持