美文网首页Android开发
Android实现下拉快捷菜单

Android实现下拉快捷菜单

作者: 卓技卓品 | 来源:发表于2021-11-15 14:21 被阅读0次

    背景

    下拉菜单快捷开关方式是用户使用非常频繁的一个功能。我们可以在手机任何界面下拉打开,完成诸如:亮度调节,音量调节,Wifi、流量、定位等功能开关。但是在之前的系统中,该功能是不对第三方应用开发者开放的,大家只能眼睁睁看着系统功能占据用户入口。


    image.png

    但是在Android 7.0(Nougat)中,这个功能竟然放开了。
    该版本其中一个新特性就是新增了对第三方应用自定义下拉菜单快捷方式的支持,效果如上。Android开发者平台参考文档描述如下:

    Quick Settings is a popular and simple way to expose key settings and actions, directly from the notification shade. In Android 7.0, we've expanded the scope of Quick Settings to make it even more useful and convenient.
    We've added more room for additional Quick Settings tiles, which users can access across a paginated display area by swiping left or right. We've also given users control over what Quick Settings tiles appear and where they are displayed — users can add or move tiles just by dragging and dropping them.
    For developers, Android 7.0 also adds a new API that lets you define your own Quick Settings tiles to give users easy access to key controls and actions in your app.
    Quick Settings tiles are reserved for controls or actions that are either urgently required or frequently used, and should not be used as shortcuts to launching an app.
    Once you’ve defined your tiles, you can surface them to users, who can add them to Quick Settings just by drag and drop.

    翻译内容如下:

    “快速设置”通常用于直接从通知栏显示关键设置和操作,非常简单。在 Android 7.0 中,我们已扩展“快速设置”的范围,使其更加有用、更方便。
    我们为额外的“快速设置”图块添加了更多空间,用户可以通过向左或向右滑动跨分页的显示区域访问它们。我们还让用户可以控制显示哪些“快速设置”图块以及显示的位置 — 用户可以通过拖放图块来添加或移动图块。
    对于开发者,Android 7.0 还添加了一个新的 API,从而让您可以定义自己的“快速设置”图块,使用户可以轻松访问您应用中的关键控件和操作。
    对于急需或频繁使用的控件和操作,保留“快速设置”图块,且不应将其用作启动应用的快捷方式。
    定义图块后,您可以将它们显示给用户,用户可通过拖放将图块添加到“快速设置”。
    下面咱们就具体讲述一下实现过程。

    实现

    创建QsServer,使其继承TileService:

    public class QsServer extends TileService {
      private static final String TAG = QsServer.class.getSimpleName();
      @Override
      public void onClick() {
        Log.d(TAG, "onClick");
        // 进行业务处理
        refresh();
      }
      /**
       * 处理点击逻辑,并刷新按钮显示效果
       */
      public void refresh() {
        // 获取当前开关状态
        int state = getQsTile().getState();
        // 改变开关状态
        state = (state == Tile.STATE_ACTIVE)?Tile.STATE_INACTIVE:Tile.STATE_ACTIVE;
        Log.d(TAG, "refresh:" + state);
        getQsTile().setState(state);
        // 刷新显示
        getQsTile().updateTile();
      }
    }
    

    然后在AndroidManifest.xml文件进行声明:

            <service
                android:name=".service.QsServer"
                android:exported="true"
                android:enabled="true"
                android:icon="@mipmap/applock_lock"     
                android:label="@string/applock"
                android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
                <intent-filter>
                    <action android:name="android.service.quicksettings.action.QS_TILE" />
                </intent-filter>
            </service>
    

    上面代码中:图片资源applock_lock、字符串applock均是应用内资源,需替换成项目内实际资源。
    上面代码执行后,就可以看到在下拉菜单中自己定义的图标了。
    由于系统优先显示系统图标,所以自定义图标一般在最后。此时可以点击右上角编辑按钮,找到设置的菜单,拖拽到前列显示。
    上面代码实现了点击开关更新显示效果功能。也可以实现点击开关打开指定页面功能,对应代码如下:

    public class QsServer extends TileService {
      private static final String TAG = QsServer.class.getSimpleName();
      @Override
      public void onClick() {
        Log.d(TAG, "onClick");
        // 打开指定页面
        Intent intent = new Intent(this, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        // 跳转指定页面,并关闭下拉菜单
        startActivityAndCollapse(intent);
      }
    }
    

    通过快捷菜单要么实现点击开关功能,要么实现点击跳转功能,以上两段代码分别实现了对应功能。本次实例使用开源项目,所有代码均已上传到Github,若需参考请自行获取:sleepassistant

    总结

    最后分析一下系统TileService及Tile类。
    它们是系统提供的quicksettings服务和组件,包含常用的快捷菜单的常用操作。包括:

    • 用户操作时触发:

    onClick() 当前开关被点击时调用
    onDestroy() 当前开关将要被销毁时调用
    onStartListening() 当前开关进入监听状态(下拉菜单显示)时调用
    onStopListening() 当前开关退出监听状态(隐藏下拉菜单)时调用
    onTileAdded() 当前开关被添加到Quick Settings时调用
    onTileRemoved() 当前开关被从Quick Settings中删除时调用

    • 可使用的方法:

    getQsTile() 获取Tile
    isLocked() 返回屏幕是否被锁定
    isSecure() 返回设备是否处于安全状态
    unlockAndRun(Runnable) 在执行Runnable前提示用户解锁设备
    startActivityAndCollapse(Intent) 折叠下拉菜单并启动Activity
    showDialog(Dialog) 折叠下拉菜单并显示对话框

    • Tile支持的方法:

    getState()
    The current state of the tile.
    获取Tile的当前状态。

    setState(int state)
    Sets the current state for the tile.
    设置Tile的当前状态。

    getIcon()
    Gets the current icon for the tile.
    获取Tile的当前图标。

    setIcon(Icon icon)
    Sets the current icon for the tile.
    设置Tile的当前图标。

    getLabel()
    Gets the current label for the tile.
    获取Tile的当前标签。

    setLabel(CharSequence label)
    Sets the current label for the tile.
    设置Tile的当前标签。

    getContentDescription()
    Gets the current content description for the tile.
    获取Tile的当前内容描述。

    setContentDescription(CharSequence contentDescription)
    Sets the current content description for the tile.
    设置Tile的当前内容描述。

    updateTile()
    Pushes the state of the Tile to Quick Settings to be displayed.
    将 Tile 的状态推送到要显示的快速设置。</pre>

    注:本文来源于卓技卓品,任何转发请注明来源。

    相关文章

      网友评论

        本文标题:Android实现下拉快捷菜单

        本文链接:https://www.haomeiwen.com/subject/jslqtrtx.html