Android - Quick SettingsにCustom Tile追加する方法(kotlin)

By JS | Last updated: June 08, 2020

Android 7.0(API 24)からQuick Settings Tilesをサポートします。 この機能は、Quick SettingsにCustom Tileを追加することができる機能です。

Android Quick settings

私のアプリに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-filterandroid: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を追加することができます。

下の画面で左下のPenの形のアイコンをタップします。 Android Quick settings

その後、私のアプリのTileが見えます。これをドラッグして、Quick Settingsに追加します。 Android Quick settings

再びQuick Settings画面に戻ると、追加されたことを見ることができます。 Android Quick settings

このときTileをクリックしてもOn / Offされるようにアイコンの色が変更されません。

Tileがクリックされたときの状態を変更してくれるアイコンの色が変わります。

Tile状態の変更

Tileの状態は3つあります。

  • STATE_ACTIVE:有効になっています。 OnまたはEnableのとおりです
  • STATE_INACTIVE:無効になっています。 OffまたはDisableのとおりです
  • STATE_UNAVAILABLE:使用不可能な状態です。この状態では、クリックすることはできません

左からACTIVE、INACTIVE、UNAVAILABLE状態に応じTileのアイコンです。 Android Quick settings

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

codechachaCopyright ©2019 codechacha