Skip to the content.

Android TileService

1. TileService Android N 7.0 (API 24)新功能 - 添加快速设定

在Android N version 其中一个功能,就是允许三方app可以添加自己的快速设定,到系统的下拉设定中,方便用户快速打开关闭某些功能.

1.创建一个class,继承TileService,TileService是N SDK新添加的,SDK更新到N 7.0(API 24)

import android.content.Intent;
import android.os.IBinder;
import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
import android.util.Log;

/**
 * Created by jayqiu 
 */

public class MyTileService extends TileService {
    private  int num=0;
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
   // 第一次是用户添加tile到快速设置面板的时候。此时系统会绑定你的TileService,然后调用onTileAdded(),这个地方是适合做初始化工作。
    @Override
    public void onTileAdded() {
        super.onTileAdded();
    }
//    最后一个阶段,也是我不希望看到的阶段,是移除tile,回调 onTileRemoved()(译者:在回调onTileRemoved()之前还会回调一次onStopListening())。
//    此时,你的应用应该停下所有和tile相关的工作,直到tile再次被添加到快速设置面板(也许移除是误操作?我们希望如此吧)。

    @Override
    public void onTileRemoved() {
        super.onTileRemoved();
    }
    //添加tile之后,在每一次tile可见的时候都会回调onStartListening(),这时候一般期望更新tile,注册其他需要的listners。然后每次不可见的时候回调 onStopListening()。
    @Override
    public void onStartListening() {
        super.onStartListening();
    }

    @Override
    public void onStopListening() {
        super.onStopListening();
    }

    @Override
    public void onClick() {
        super.onClick();
        num++;
        boolean enabled = num % 2 == 0;
        Log.d("TEST","Run onClick enabled = " + enabled);
        getQsTile().setState(enabled ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE);
        getQsTile().updateTile();

    }

    @Override
    public IBinder onBind(Intent intent) {
        return super.onBind(intent);
    }
}



<service android:name=".MyTileService"
            // icon
            android:icon="@drawable/ic_launcher_background"
            //显示名称
            android:label="@string/app_name"
            android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
            <intent-filter>
                <action android:name="android.service.quicksettings.action.QS_TILE"/>
            </intent-filter>
        </service>

2.TileService的生命周期

TileService是一个绑定的服务,因此其生命周期主要由Android系统控制。 TileService有三个阶段:被添加,监听和被删除。

第一阶段:

第一次是用户添加tile到快速设置面板的时候。此时系统会绑定你的TileService,然后调用onTileAdded(),这个地方是适合做初始化工作。 #### 第二阶段
添加tile之后,在每一次tile可见的时候都会回调onStartListening(),这时候一般期望更新tile,注册其他需要的listners。然后每次不可见的时候回调 onStopListening()。 #### 第三阶段
最后一个阶段,也是我不希望看到的阶段,是移除tile,回调 onTileRemoved()(译者:在回调onTileRemoved()之前还会回调一次onStopListening())。此时,你的应用应该停下所有和tile相关的工作,直到tile再次被添加到快速设置面板(也许移除是误操作?我们希望如此吧)。

在tile不可见的时候TileService几乎肯定会被解绑(destroyed),不要以为你写的Service会在 onStartListening()/onStopListening()之外继续存在。

3.TileSerivce另外的life:active mode(激活状态)

默认当tile可见的时候才会绑定你的TielService,但是如果你准确的知道什么时候需要更新tile(基于后台数据同步),强烈推荐你把TileService设置成active状态,添加META_DATA_ACTIVE_TILE到manifest里面: ```java

```

4.更新tile

介于onStartListening() 和 onStopListening()之间时,你可以更新tile的UI。每个TileService都有一个单独的Tile来表示tile的UI,可以调用getQsTile()获得Tile。

tile界面的主要组成部分包括图标(icon),标签(label)和内容描述(content description)(辅助服务/无障碍功能)。图标使用的是Marshmallow中引入的Icon类。这表示你的图标可以创建自Bitmap,,content URI, byte array, file path或者通过静态createWith方法获得的资源。

UI的另外组成部分是tile的状态(state),一个tile可以是以下三种状态:
STATE_ACTIVE “开”或者“启用”状态
STATE_INACTIVE “关”或者“禁用”状态
STATE_UNAVAILABLE 禁用点击事件

androd:icon和android:label 是TileService中非常关键的部分。当用户选择tiles添加到快速设置面时,看到的正是这两个属性的值。加上对应的permission才行.
选择标签应当尽量短(小于18字符不然会超出显示范围),图标应选择透明背景的纯白矢量图(只有透明度可以调整)。请记住,tile只能用在API 24+的版本上,所以这正是你避免使用png图像的好时机(译者:这是叫你尽量用矢量图)。

getQsTile().setState(enabled ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE);

ACTIVE和INACTIVE其实就是对图做翻色的一个设定,我没有测试这里是否可以放置非白色的图,但是default都是这种白色的icon,然后反转成黑底的

5.onClick 点击事件的处理(onClick()工作在UI线程)

除非是不可用的tile,不然用户都可以点击tile触发一个事件。当onClick()被回调的时候,你有许多选择。最明显的一个是在后台工作。要记住,onClick()工作在UI线程,所以你要把复杂的工作移到另一个线程(或者Service-比如IntentService)


在已锁屏设备上使用的时候有一些限制。当isLocked()返回true的时候,你不能显示dialog,activity则必须设置flag  FLAG_SHOW_WHEN_LOCKED才能在锁屏界面之上显示。unlockAndRun()这个方法可用来提示用户解锁他们的设备,在用户解锁设备之后才允许运行代码(比如显示dialog)。

快速设置tile上的长点击事件默认会跳转到“应用信息”界面。开发者可以通过添加值为ACTION_QS_TILE_PREFERENCES的<intent-filter>到activity来覆盖这个跳转。

Quick Settings Tiles on Android 7.0