參考文檔:
Android 7.0 允許你直接在通知欄添加自定義的圖標(biāo)兵拢。雖然不知道國內(nèi)的系統(tǒng)會(huì)如何處理這個(gè)功能已慢,但是可以先來嘗嘗鮮。
什么是Quick Setting Tile
就是通知欄上的圖標(biāo)递惋,比如 Wifi 開關(guān)柔滔,手電筒開關(guān)等。
什么操作適合使用 Quick Setting Tile
相比于桌面快捷方式萍虽,Widget 等方式睛廊,Setting Tiles 的優(yōu)勢是更方便更快捷,不需要解鎖手機(jī)就能使用杉编。
那么超全,什么樣的操作適合Quick Setting Tile。官方的博客認(rèn)為需要考慮操作的緊急度(Urgency) 和使用率(Frequency)邓馒。
上面說到的兩點(diǎn)中Urgency 的優(yōu)先級(jí)更高嘶朱,因?yàn)?Frequency 因人而異,每一個(gè)用戶都不一樣绒净。
Tilte Service
要?jiǎng)?chuàng)建自定義的 Title见咒,要提供一個(gè)跟圖標(biāo)綁定的 Tile Service。Tile Service 是一種的特殊的 Service挂疆,它的生命周期完全由系統(tǒng)來控制改览。
Title Service 的定義方法跟普通的 Service 沒有區(qū)別,需要在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 是在通知欄顯示的圖標(biāo)缤言。需要選一個(gè)前景色為白色宝当,背景色為透明的向量圖標(biāo),最好是一個(gè)有意義的圖標(biāo)胆萧。
label 是圖標(biāo)的標(biāo)題庆揩,不應(yīng)該超過18個(gè)字符。
permission 和 action 標(biāo)識(shí)出這個(gè) Service 是一個(gè) Title Service跌穗。
Title Service 的生命周期
Title Service 是一個(gè)Bound Service. 所以她的生命周期完全是由 Android 系統(tǒng)控制的订晌。
Tile Service 的主要生命周期有:
- onTileAdded() 當(dāng)用戶將圖標(biāo)添加到通知欄的時(shí)候調(diào)用。
- onStartListening() 當(dāng)圖標(biāo)變得可見的時(shí)候調(diào)用蚌吸。
- onStopListening() 當(dāng)圖標(biāo)變得不可見的時(shí)候調(diào)用锈拨。
- onTileRemoved() 當(dāng)用戶將圖標(biāo)移除的時(shí)候調(diào)用。
可以根據(jù)需求去使用這四個(gè)函數(shù)羹唠。注意 Tile Service 在onStopListening()之后就會(huì)結(jié)束了奕枢。不要假定在 start 到 stop 之外 service 還能存活。
處理點(diǎn)擊事件
處理 Tile 的點(diǎn)擊事件也很簡單佩微。重寫 TileService 的 onClick 方法就可以了缝彬。
點(diǎn)擊事件中可以打開一個(gè) Dialog 或者 Activity。但是要注意一點(diǎn)哺眯,Tile 可能在鎖屏的情況下被點(diǎn)擊谷浅,這時(shí)是不能彈出 Dialog 的,但是可以打開帶有 FLAG_SHOW_WHEN_LOCKED Flag 的 Activity奶卓。但是這兩種方式其實(shí)都不是特別自然一疯,不推薦使用。
下面是一段 click 的示例代碼, 用戶每次點(diǎn)擊都會(huì)改變圖標(biāo)的狀態(tài)寝杖。
@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(); // 更新完后必須調(diào)用 update 才能生效
}
其他
關(guān)于 QSTile 還有很多相關(guān)的內(nèi)容违施。上面只是一個(gè)基礎(chǔ)的教程。更多的內(nèi)容請閱讀參考文檔瑟幕。
demo
https://github.com/Guaidaodl/Android-Demos/tree/master/QSTile