当前位置: 首页 > news >正文

Android Tile快捷设置

在 Android 手机上快速更改设置

您可以在手机的任何屏幕中,通过“快捷设置”菜单查看和更改设置。为了方便访问您经常更改的设置,您可以将这些设置添加或移动到“快捷设置”中。

创建Tile

1.创建您的自定义图标

您需要提供一个自定义图标,该图标显示在“快速设置”面板的磁贴上。(您将在声明 时添加此图标TileService,将在下一节中介绍。)该图标必须是带有透明背景的纯白色,尺寸为 24 x 24dp,格式为 VectorDrawable.

2.创建并声明您的 TileService

TileService为扩展类的磁贴创建服务。

public class QuickSettingsService extends TileService {

    private static final String SERVICE_STATUS_FLAG = "serviceStatus";
    private static final String PREFERENCES_KEY = "com.google.android_quick_settings";

    /**
     * Called when the tile is added to the Quick Settings.
     * @return TileService constant indicating tile state
     */

    @Override
    public void onTileAdded() {
        Log.d("QS", "Tile added");
    }

    /**
     * Called when this tile begins listening for events.
     */
    @Override
    public void onStartListening() {
        Log.d("QS", "Start listening");
    }

    /**
     * Called when the user taps the tile.
     */
    @Override
    public void onClick() {
        Log.d("QS", "Tile tapped");

        updateTile();
    }

    /**
     * Called when this tile moves out of the listening state.
     */
    @Override
    public void onStopListening() {
        Log.d("QS", "Stop Listening");
    }

    /**
     * Called when the user removes this tile from Quick Settings.
     */
    @Override
    public void onTileRemoved() {
        Log.d("QS", "Tile removed");
    }

    // Changes the appearance of the tile.
    private void updateTile() {

        Tile tile = this.getQsTile();
        boolean isActive = getServiceStatus();

        Icon newIcon;
        String newLabel;
        int newState;

        // Change the tile to match the service status.
        if (isActive) {

            newLabel = String.format(Locale.US,
                    "%s %s",
                    getString(R.string.tile_label),
                    getString(R.string.service_active));

            newIcon = Icon.createWithResource(getApplicationContext(),
                    ic_android_black_24dp);

            newState = Tile.STATE_ACTIVE;

        } else {
            newLabel = String.format(Locale.US,
                    "%s %s",
                    getString(R.string.tile_label),
                    getString(R.string.service_inactive));

            newIcon =
                    Icon.createWithResource(getApplicationContext(),
                            android.R.drawable.ic_dialog_alert);

            newState = Tile.STATE_INACTIVE;
        }

        // Change the UI of the tile.
        tile.setLabel(newLabel);
        tile.setIcon(newIcon);
        tile.setState(newState);

        // Need to call updateTile for the tile to pick up changes.
        tile.updateTile();
    }

    // Access storage to see how many times the tile
    // has been tapped.
    private boolean getServiceStatus() {

        SharedPreferences prefs =
                getApplicationContext()
                        .getSharedPreferences(PREFERENCES_KEY,
                                MODE_PRIVATE);

        boolean isActive = prefs.getBoolean(SERVICE_STATUS_FLAG, false);
        isActive = !isActive;

        prefs.edit().putBoolean(SERVICE_STATUS_FLAG, isActive).apply();

        return isActive;
    }
}

TileService在应用的清单文件中声明您的。添加您的 的名称和标签、您TileService在上一节中创建的自定义图标以及适当的权限。

 <service
     android:name=".MyQSTileService"
     android:label="@string/my_default_tile_label"  // 18-character limit.
     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>
 </service>

管理 TileService

1.TileService 生命周期概述
除了控制绑定服务生命周期的回调之外,您还必须实现特定于TileService生命周期的其他方法。这些方法可以在外部调用onCreate(),onDestroy()因为Service 生命周期方法和TileService生命周期方法是在两个单独的异步线程中调用的。

生命TileService周期包含以下方法,每次TileService进入新的生命周期阶段时系统都会调用这些方法:

  • onTileAdded():此方法仅在用户第一次添加您的磁贴时调用,并且如果用户删除并再次添加您的磁贴。这是进行任何一次性初始化的最佳时机。但是,这可能无法满足所有需要的初始化。

注意:在创建 tile 时不会调用。例如,如果在设备关闭之前已添加且未移除磁贴,则在设备重新启动或打开电源时不会调用。 onTileAdded()onTileAdded()

  • onStartListening()和onStopListening():这些方法在您的应用更新磁贴时被调用,并且经常被调用。TileService仍然绑定在onStartListening()和 之间,允许您的 onStopListening()应用修改磁贴并推送更新。

  • onTileRemoved():仅当用户移除您的磁贴时才会调用此方法。

注意:这些阶段可能不会连续发生。onTileAdded()当您的磁贴被用户添加到他们的快速设置面板时,只能调用一次。 onStartListening()并且onStopListening()可能在整个生命周期中被多次调用TileService。onTileRemoved()如果用户没有从他们的快速设置面板中删除您的磁贴,将永远不会被调用。

2.平铺状态概述
用户添加您的磁贴后,它始终处于以下状态之一。

  • STATE_ACTIVE:表示开启或启用状态。用户可以在此状态下与您的磁贴进行交互。

例如,对于允许用户启动定时锻炼会话的健身应用程序磁贴,STATE_ACTIVE这意味着用户已启动锻炼会话并且计时器正在运行。

  • STATE_INACTIVE:表示关闭或暂停状态。用户可以在此状态下与您的磁贴进行交互。

再次使用健身应用程序磁贴示例,磁贴STATE_INACTIVE表示用户尚未启动锻炼会话,但如果他们愿意,可以这样做。

  • STATE_UNAVAILABLE: 表示暂时不可用的状态。在此状态下,用户无法与您的磁贴进行交互。

例如,一个磁贴STATE_UNAVAILABLE表示该磁贴由于某种原因当前对用户不可用。

用于STATE_UNAVAILABLE当前不可用但可以稍后进入可用状态的图块。如果该组件将永远不再可供用户使用,请COMPONENT_ENABLED_STATE_DISABLED 传入setComponentEnabledSetting().
系统只设置Tile对象的初始状态。您可以在Tile 对象的剩余生命周期中设置对象的状态。

系统可能会为平铺图标和背景着色以反映 Tile对象的状态。Tile对象设置为STATE_ACTIVE最暗, STATE_INACTIVE越来越亮STATE_UNAVAILABLE。确切的色调特定于制造商和版本。

3.更新您的磁贴
收到回调后,您可以更新您的磁贴onStartListening()。根据磁贴的模式,您的磁贴至少可以更新一次,直到收到对onStopListening().

在活动模式下,您可以在收到回调之前只更新一次磁贴onStopListening()。onStartListening()在非活动模式下,您可以在和之间多次更新您的磁贴onStopListening()。

注意:活动模式允许您更新您的图块,无论您的图块是否对用户可见。
您可以通过调用来检索您的Tile对象getQsTile()。要更新对象的特定字段,请Tile调用以下方法:

setContentDescription()
setIcon()
setLabel()
setState()
setStateDescription()
setSubtitle()

应用清单文件中设置的图标和标签是“快速设置”面板中磁贴上显示的默认值。但是,您可以 在更新磁贴以将字段设置为新值时调用setIcon()和setLabel()方法。将对象的字段设置为正确的值后,您必须调用updateTile()以更新您的磁贴。Tile这将使系统解析更新的图块数据并更新 UI。

相关参考:

https://developer.android.com/develop/ui/views/quicksettings-tiles

相关文章:

  • JVM监控和诊断的工具(JProfiler)
  • 批判性思维读书笔记
  • 42-瑞吉外卖(SpingBoot+MyBatisPlus)
  • Docker(4)Docker镜像
  • 同义词/近义词查询易语言代码
  • Python Tkinter 教程(四)—— 子模块 messagebox、colorchooser 以及 filedialog 的使用及技巧(万字详解)
  • C++画图 => 蓝桥杯青少组C++ => 信奥 学习路线图
  • 微信公众号的附件链接怎么弄
  • 概率论与梳理统计学习:随机变量(二)——知识总结与C语言案例实现
  • python学习—第一步—Python小白逆袭大神(第二天)
  • SAP ABAP ALV 的一些总结:Custom container 和 Splitter container
  • 由从零开始的神经网络理解torch的几个模块
  • R语言进行数据分组聚合统计变换(Aggregating transforms)、计算dataframe数据的分组独特值的个数(distinct)
  • Linux入门之使用 ifconfig 命令配置网络连接
  • Day 1 BUUCTF——特殊的 BASE64 1
  • __proto__ 和 prototype的关系
  • 10个确保微服务与容器安全的最佳实践
  • Angular 响应式表单 基础例子
  • CentOS6 编译安装 redis-3.2.3
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • ES学习笔记(12)--Symbol
  • extract-text-webpack-plugin用法
  • gitlab-ci配置详解(一)
  • HTML5新特性总结
  • js数组之filter
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • PHP面试之三:MySQL数据库
  • 从伪并行的 Python 多线程说起
  • 欢迎参加第二届中国游戏开发者大会
  • 你真的知道 == 和 equals 的区别吗?
  • 前端技术周刊 2019-02-11 Serverless
  • 深入 Nginx 之配置篇
  • 移动端 h5开发相关内容总结(三)
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # Java NIO(一)FileChannel
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #QT(一种朴素的计算器实现方法)
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (bean配置类的注解开发)学习Spring的第十三天
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (分类)KNN算法- 参数调优
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (一)RocketMQ初步认识
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 服务 ServiceController
  • .net 微服务 服务保护 自动重试 Polly
  • .NET 中创建支持集合初始化器的类型