下拉面板快捷方式(TileService)自定义

373 阅读2分钟

基于Android R版本分析

TileService - Android中文版 - API参考文档;

车控车设快捷方式使用说明

1. 定义TileService

package com.nobo.tiledemo;
​
import android.service.quicksettings.TileService;
​
public class DemoTile extends TileService {
​
    /**
     * 由系统调用以通知服务它开始使用并正在被添加
     *
     * 简单理解为Customize Tile添加到快捷面板中
     */
    @Override
    public void onCreate() {
        super.onCreate();
    }
​
    /**
     * 当此图块移入侦听状态时调用
     *
     * 可以简单的理解为,当自定义Tile icon位于快捷面板界面时,开启快捷面板
     * 则开启Customize Tile Listener
     */
    @Override
    public void onStartListening() {
        super.onStartListening();
    }
​
    /**
     * 当此图块移出侦听状态时调用
     *
     * 可以简单的理解为,当自定义Tile icon位于快捷面板界面时,退出快捷面板
     * 则停止Customize Tile Listener
     */
    @Override
    public void onStopListening() {
        super.onStopListening();
    }
​
    /**
     * 当用户将此图块添加到快速设置时调用
     */
    @Override
    public void onTileAdded() {
        super.onTileAdded();
    }
​
    /**
     * 当用户从快速设置中删除此图块时调用
     */
    @Override
    public void onTileRemoved() {
        super.onTileRemoved();
    }
​
    /**
     * 当用户点击此图块时调用
     *
     * 该方法实现具体的业务逻辑
     */
    @Override
    public void onClick() {
        super.onClick();
    }
​
    /**
     * 由系统调用以通知服务它已不再使用并正在被删除
     *
     * 简单理解为Customize Tile从快捷面板中移除
     */
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

2. AndroidManifest.xml中声明Service

<service
         android:name=".DemoTile"
         android:label="DemoTile"
         android:icon="@drawable/my_default_icon_label"
         android:exported="true"
         android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
    <intent-filter>
        <action android:name="android.service.quicksettings.action.QS_TILE" />
    </intent-filter>
</service>
核心点

这里面需要注意几个关键点:

属性
  • label:该属性不是必须的,在底层中,会判断label属性是否定义,如果没有定义,则默认为 "null" ,切记,这里的null,代表的是“null”字符串;
  • icon:这个是必须要定义的属性,如果没有定义,则底层不会加载当前的Service,即Customize Tile无效;还有icon value和application的icon不能同时等于0,当同时都等于0时,默认Customize Tile无效;
  • exported:需要根据具体的业务逻辑进行定义,不是必须项。在有intent-filter定义时,默认值为true,否则为false;
  • permission:这个属性定义也是必须的,只有声明了"android.permission.BIND_QUICK_SETTINGS_TILE"权限的TileService才能生效,否则无效;
intent-filter

针对Service的intent filter,必须要定义规定的ACTION:

android.service.quicksettings.action.QS_TILE

只有定义了该ACTION的Service,在底层遍历ServiceInfo的时候,才可以通过Intent的方式过滤指定的ACTION来查询所有适配的TileService;

3. AndroidManifest Service 解析

针对priv_app以及实时的install类型的apk中声明的TileService都支持;

4. 使用范围

需要适配白名单的应用进程所声明的TileService才可以生效,否则无效;

适配规则:packageName + serviceName