Android-快速设置-Quick settings tile

Android7.0的Quick settings tile

在Android7.0之后,任何程序都可以设置屏幕顶部下拉的设置了,为应用的快捷设置提供了极大的方便。

什么是优秀的快速设置

什么设置适合作为Quick settings tile,有两个关键要素:紧迫性高频
image
大家注意,因为这是一个常驻的设置,所以并不适合那些一次性的设置。

添加TileServuce

咱们首先需要定义一个继承TileService的服务,TileService是一个特殊的服务,在7.0系统中会自动识别并开启,这也就解决了低版本适配的问题。然后和其他的自定义服务一样,需要在manifest中配置:

<service
  android:name=".AwesomeTileService"
  android:icon="@drawable/ic_tile_default"
  android:label="快速设置"
  android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
  <intent-filter>
    <action
      android:name="android.service.quicksettings.action.QS_TILE"/>
  </intent-filter>
</service>

image

这里咱们需要配置Tile的名字,icon。以及对应的permission.
Tile多余18个字符会被截断,icon需要使用一张透明背景的白色矢量图,图片的着色是由当前系统决定的。

Tile生命周期

我们可以实现TileService的几个生命周期函数:

public class QuickSettingService extends TileService{
    //当用户从Edit栏添加到快速设置中调用
    @Override
    public void onTileAdded() {
        Log.d(LOG_TAG, "onTileAdded");
    }
    //当用户从快速设置栏中移除的时候调用
    @Override
    public void onTileRemoved() {
        Log.d(LOG_TAG, "onTileRemoved");
    }
    // 点击的时候
    @Override
    public void onClick() {
        Log.d(LOG_TAG, "onClick");
    }
    // 打开下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用
    //在TleAdded之后会调用一次
    @Override
    public void onStartListening () {
        Log.d(LOG_TAG, "onStartListening");
    }
    // 关闭下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用
    // 在onTileRemoved移除之前也会调用移除
    @Override
    public void onStopListening () {
        Log.d(LOG_TAG, "onStopListening");
    }
}

主动调用

如果咱们需要在非点击情况下改变Tile的状态,可以将Tile的Mode改为主动模式:

<service
...
  <meta-data
    android:name="android.service.quicksettings.ACTIVE_TILE"
    android:value="true" />
</service>

可以在程序中的其他地方调用TileService.requestListeningState() 来触发 onStartListening函数

更新UI

如下代码:

public class QuickSettingService extends TileService {
    private final String LOG_TAG = "QuickSettingService";

    //当用户从Edit栏添加到快速设定中调用
    @Override
    public void onTileAdded() {
        Log.d(LOG_TAG, "onTileAdded");
    }

    //当用户从快速设定栏中移除的时候调用
    @Override
    public void onTileRemoved() {
        Log.d(LOG_TAG, "onTileRemoved");
    }

    // 点击的时候
    @Override
    public void onClick() {
        int state = getQsTile().getState();
        Log.d(LOG_TAG, "onClick state = " + Integer.toString(getQsTile().getState()));
        Icon icon;
        if (state == Tile.STATE_INACTIVE) {
            icon = Icon.createWithResource(getApplicationContext(), R.drawable.activeon);
            getQsTile().setState(Tile.STATE_INACTIVE);// 更改成非活跃状态
        } else {
            icon = Icon.createWithResource(getApplicationContext(), R.drawable.add_photo);
            getQsTile().setState(Tile.STATE_ACTIVE);//更改成活跃状态
        }

        getQsTile().setIcon(icon);//设置图标
        getQsTile().updateTile();//更新Tile
    }

    // 打开下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用
    //在TleAdded之后会调用一次
    @Override
    public void onStartListening() {
        Log.d(LOG_TAG, "onStartListening");
    }

    // 关闭下拉菜单的时候调用,当快速设置按钮并没有在编辑栏拖到设置栏中不会调用
    // 在onTileRemoved移除之前也会调用移除
    @Override
    public void onStopListening() {
        Log.d(LOG_TAG, "onStopListening");
    }
}

我们可以通过getQsTile来获得Tile对象,通过getState() 来获得Tile当前状态。
- STATE_ACTIVE 开启状态
- STATE_INACTIVE 关闭状态
- STATE_UNAVAILABLE 非可点击状态

最后必须调用updateTile() 来触发刷新。

事件处理

OnClick() 中,我们可以在UI线程上处理业务逻辑,耗时操作请交给另一个线程或IntentService执行。

其中我们可以开启Dialog或通过startActivityAndCollapse()开启一个Actvitiy

但是在锁屏,也就是isLocked()返回true时,将不能打开Dialog,而Activity则需要增加FLAG_SHOW_WHEN_LOCKED这个Flag。
我们也可以使用unlockAndRun(Runnable) 来异步设置用户解锁后的工作。

用户长按Tile会默认打开app的app info页面,我们可以给Activity加上ACTION_QS_TILE_PREFERENCES 来重载此行为。

参考文献

### 移除 Android 快速设置中的安全与隐私 TileAndroid 系统中,快速设置区域(Quick Settings Tiles)提供了便捷的功能入口,其中包括一些默认的安全和隐私相关的快捷方式。如果希望移除这些特定的 Tile 功能,则可以通过修改系统的资源文件或利用自定义 ROM 的功能来实现。 #### 方法一:通过 ADB 命令禁用指定 Tile Android 提供了调试工具 ADB(Android Debug Bridge),可以用于管理设备上的某些高级功能。对于部分可配置的 Tile,可以直接通过命令行将其隐藏。 以下是具体操作方法: 1. **启用开发者模式并连接设备** 需要在目标 Android 设备上开启开发者选项,并允许 USB 调试[^2]。 2. **执行 ADB 命令** 使用以下命令禁用某个具体的 Tile: ```bash adb shell settings put secure sysui_qs_tiles "<tiles_list>" ``` 其中 `<tiles_list>` 是一个逗号分隔的字符串列表,表示要显示的 Tile 名称。例如,默认情况下可能是 `wifi,bt,battery,sync` 等。如果想排除掉与安全和隐私相关的 Tile(如 `location`, `data_saver` 或其他敏感项),只需从该列表中删除它们即可[^3]。 3. **重启设备生效** 修改完成后需重新启动设备以应用更改。 #### 方法二:编辑 SystemUI.apk 文件 另一种更彻底的方式是对负责渲染 Quick Settings UI 的 APK 进行反编译和调整。 1. **提取原始 APK** 利用工具如 apktool 将 `/system/priv-app/SystemUI/SystemUI.apk` 下载到本地环境。 2. **定位 XML 定义** 找到描述各个 Tile 行为及其布局的相关 XML 文件路径,通常位于 `res/xml` 或者 `res/layout` 目录下。查找关键词比如 “security” 和 “privacy”,确认哪些节点对应于待移除项目。 3. **重构逻辑结构** 删除或者注释掉不需要的部分代码片段之后保存改动再打包回原位置替换旧版安装包[^4]。 注意此过程可能涉及 root 权限以及刷机风险,请谨慎尝试以免造成不可逆损害! ```xml <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Example of removing a tile --> <!--<item android:title="@string/security_tile"/>--> </PreferenceScreen> ``` 以上两种方案各有优劣,在实际部署前建议充分测试兼容性和稳定性影响因素评估后再做决定。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值