参考文档:
Android 7.0 允许你直接在通知栏添加自定义的图标。虽然不知道国内的系统会如何处理这个功能,但是可以先来尝尝鲜。
什么是Quick Setting Tile
就是通知栏上的图标,比如 Wifi 开关,手电筒开关等。
什么操作适合使用 Quick Setting Tile
相比于桌面快捷方式,Widget 等方式,Setting Tiles 的优势是更方便更快捷,不需要解锁手机就能使用。
那么,什么样的操作适合Quick Setting Tile。官方的博客认为需要考虑操作的紧急度(Urgency) 和使用率(Frequency)。
上面说到的两点中Urgency 的优先级更高,因为 Frequency 因人而异,每一个用户都不一样。
Tilte Service
要创建自定义的 Title,要提供一个跟图标绑定的 Tile Service。Tile Service 是一种的特殊的 Service,它的生命周期完全由系统来控制。
Title Service 的定义方法跟普通的 Service 没有区别,需要在manifest.xml 文件中声明:
<service
android:name=".TestTitleService"
android:icon="@drawable/ic_add_title"
android:label="@string/add_title"
android:permission="android.permission.BIND_QUICK_SETTINGS_TITLE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE"/>
</intent-filter>
</service>
icon 是在通知栏显示的图标。需要选一个前景色为白色,背景色为透明的向量图标,最好是一个有意义的图标。
label 是图标的标题,不应该超过18个字符。
permission 和 action 标识出这个 Service 是一个 Title Service。
Title Service 的生命周期
Title Service 是一个Bound Service. 所以她的生命周期完全是由 Android 系统控制的。
Tile Service 的主要生命周期有:
- onTileAdded() 当用户将图标添加到通知栏的时候调用。
- onStartListening() 当图标变得可见的时候调用。
- onStopListening() 当图标变得不可见的时候调用。
- onTileRemoved() 当用户将图标移除的时候调用。
可以根据需求去使用这四个函数。注意 Tile Service 在onStopListening()之后就会结束了。不要假定在 start 到 stop 之外 service 还能存活。
处理点击事件
处理 Tile 的点击事件也很简单。重写 TileService 的 onClick 方法就可以了。
点击事件中可以打开一个 Dialog 或者 Activity。但是要注意一点,Tile 可能在锁屏的情况下被点击,这时是不能弹出 Dialog 的,但是可以打开带有 FLAG_SHOW_WHEN_LOCKED Flag 的 Activity。但是这两种方式其实都不是特别自然,不推荐使用。
下面是一段 click 的示例代码, 用户每次点击都会改变图标的状态。
@Override
public void onClick() {
Tile tile = getQsTile(); // 获取 Tile
if (tile.getState() == Tile.STATE_ACTIVE) {
tile.setState(Tile.STATE_INACTIVE);
} else {
tile.setState(Tile.STATE_ACTIVE);
}
tile.updateTile(); // 更新完后必须调用 update 才能生效
}
其他
关于 QSTile 还有很多相关的内容。上面只是一个基础的教程。更多的内容请阅读参考文档。
demo
https://github.com/Guaidaodl/Android-Demos/tree/master/QSTile