Android 7.0(API 24)からQuick Settings Tilesをサポートします。 この機能は、Quick SettingsにCustom Tileを追加することができる機能です。
私のアプリにTileServiceを実装すると、Quick Settingsがそのサービスを探してTileに登録しています。 Tileは、例えばQuick Settingsに見えるWIFIアイコンのようなものを言うのです。
TileはActivityを実行したり、ポップアップをトィオはより、WIFIのようにon / offにどのような機能をオンまたはオフに動作が必要なときに使用すると、お勧めします。
Custom Tile登録するために私のアプリに実装する必要がないことはTileServiceサービスを実装してManifestに宣言することです。
サンプルアプリを作って見Custom Tileを追加する方法について説明します。
この記事は、kotlinで作成されました。完成されたサンプルは、GitHub - TileServiceで確認することができます。
TileService구현하기
私のアプリには、次のようにTileServiceを継承するサービスを作成します。
@RequiresApi(api = Build.VERSION_CODES.N)
class MyTileService : TileService() {
override fun onTileAdded() {
}
override fun onTileRemoved() {
}
override fun onStartListening() {
}
override fun onStopListening() {
}
override fun onClick() {
}
companion object {
val TAG = MyTileService::class.java.simpleName
}
}
それぞれのメソッドの説明は、次のとおりです。
- onTileAdded():Quick SettingsにTileが追加されるときに呼び出されます
- onTileRemoved():Quick SettingsにTileが削除されるときに呼び出されます
- onClick():Tileをクリックしたときに呼び出されます
- onStartListening():Tileの変化がある場合に呼び出されます。 onClick()の前に呼び出されます
- onStartListening():Tileの変化がある場合に呼び出されます。 onClick()の後に呼び出されます
ManifestにTileService登録
アプリのAndroidManifest.xmlに以下のようなサービスを登録します。
<service
android:name=".MyTileService"
android:label="Cloud"
android:icon="@drawable/ic_cloud"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
それぞれの属性の役割は次のとおりです。
android:label
:Quick Settingsに見える名前ですandroid:icon
:Quick Settingsに表示されるアイコンですandroid:permission
:Quick Settingsのみ私のサービスを利用できるようにパーミッションを設定してくれるしintent-filter
のandroid:name
:Quick SettingsこのTileServiceを見つけるときに、このactionに検索します。android.service.quicksettings.action.QS_TILE
をActionに設定しないとQuick Settingsが私のアプリのTileServiceを見つけることができませんでした
Iconは白にすることをお勧め。 Tileを有効または無効にすると、Quick SettingsがTintに色を変更するためです。
基本的なアイコンは、 File -> New -> Image Asset
で簡単に作成することができます。
TileをQuick Settingsに追加する
今までTileServiceを作成し、アプリに登録もしました。
今Quick Settingsの内アプリのTileを追加することができます。
その後、私のアプリのTileが見えます。これをドラッグして、Quick Settingsに追加します。
再びQuick Settings画面に戻ると、追加されたことを見ることができます。
このときTileをクリックしてもOn / Offされるようにアイコンの色が変更されません。
Tileがクリックされたときの状態を変更してくれるアイコンの色が変わります。
Tile状態の変更
Tileの状態は3つあります。
STATE_ACTIVE
:有効になっています。 OnまたはEnableのとおりですSTATE_INACTIVE
:無効になっています。 OffまたはDisableのとおりですSTATE_UNAVAILABLE
:使用不可能な状態です。この状態では、クリックすることはできません
左からACTIVE、INACTIVE、UNAVAILABLE状態に応じTileのアイコンです。
TileこのQuick Settingsに追加されると、 onTileAdded()
が呼び出され、このとき、次のように初期値を設定することができます。
override fun onTileAdded() {
qsTile.state = Tile.STATE_INACTIVE
qsTile.updateTile()
}
Tileの state
を変更すると、必ずupdateTile()
を呼び出す必要があります。それ以外の場合Tileのアイコンの色が変わりません。
Tile Clickイベントを処理
Tileをクリックすると、 onClick()
が呼び出され、このときTileのstateを変更することができます。
次のようにクリックするたびにTileの状態がToggleされるようにしました。
override fun onClick() {
when (qsTile.state) {
Tile.STATE_ACTIVE -> {
Log.d(TAG, "Current State is STATE_ACTIVE. change to STATE_INACTIVE")
qsTile.state = Tile.STATE_INACTIVE
}
Tile.STATE_INACTIVE -> {
Log.d(TAG, "Current State is STATE_INACTIVE. change to STATE_ACTIVE")
qsTile.state = Tile.STATE_ACTIVE
}
}
qsTile.updateTile()
}
また、TileのStateを変更することに加えて、他のタスクを実行するようにコードを追加することができます。
LockscreenでQuick Settingsが開いていることを確認
isLocked
はLockscreenが画面に見える状態であることをお知らせします。もしtrueを返した場合、現在LockscreenでQuick settingsを開いたと考えることができます。
Lockscreenで別の動作を実行する必要がある場合は、次のように実装することができます。
override fun onClick() {
Log.d(TAG, "isLocked: $isLocked")
if (isLocked) {
// ...
}
}
まとめ
私のアプリでTileServiceを実装する場合Quick SettingsにTileを登録することができます。 特に難しいことはなくManifestに約束された形で定義をします。 Tileがクリックされたときの状態を変更してくれて、必要なタスクを処理するために実装します。
この記事で使用された例では、GitHub - TileServiceで確認することができます。
参考
Related Posts
- エラー解決:android gradle plugin requires java 11 to run. you are currently using java 1.8.
- Android - コルーチンとRetrofitによる非同期通信の例
- Android - コルーチンでURL画像を読み込む
- Android - 振動、Vibrator、VibrationEffectの例
- Some problems were found with the configuration of task
- Query method parameters should either be a type that can be converted into a database column or a List
- UbuntuでAndroid 12オープンソースをダウンロードしてビルド
- Android - ViewModelを生成する方法
- Android - Transformations.map(), switchMap() の違い
- Android-Transformations.distinctUntilChanged()소개
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - 携帯電話の電話番号を取得する方法
- Android 12 - Splash Screens
- Android 12 - インクリメンタルインストール
- Android - adbコマンドでbugreportログファイルの抽出
- Android - adbコマンドでAppデータを削除する
- Android - adbコマンドでアプリ無効化、有効化
- Android - adbコマンドで特定のパッケージのPIDを検索
- Android - adbコマンドでパーミッションGrantまたはRevoke
- Android - adbコマンドで特定のパッケージのプロセスの終了
- Android - adbコマンドでapkのインストール、削除、
- Android - adb push、pullでファイルのコピー、ダウンロード
- Android - adbコマンドでscreen capture保存
- Android - adbコマンドでSystemアプリの削除、インストール
- Android - adbコマンドでsettings value確認、変更、
- Android 12 - IntentFilterのexported明示的な宣言
- Android - adbコマンドで工場出荷時の(Factory reset)
- Android - adb logcatコマンドでログ出力
- Android - adbコマンドでメモリダンプ(dump-heap)
- Android - adbコマンドでApp強制終了(force-stop)
- Android - adbコマンドでServiceの実行、終了
- Android - adbコマンドでActivity実行
- Android - adbコマンドでBroadcast配信
- Android - PackageManagerにPackage情報を取得する
- Android - ACTION_BOOT_COMPLETEDイベント受信