クイック設定は、クイック設定パネルに表示されるタイルで、
ユーザーがタップして、繰り返すタスクをすばやく完了できるようにします。
アプリでは、TileService
を使用してユーザーにカスタムタイルを提供できます。
クラスと、Tile
オブジェクトを使用してタイルの状態を追跡します。たとえば
アプリが提供する VPN をユーザーが有効にしたり、
オフにします。
![VPN タイルが表示されたクイック設定パネル
オンとオフ](https://android-dot-devsite-v2-prod.appspot.com/static/develop/ui/views/images/quick-settings-vpn-on-off.png?hl=ja)
タイルを作成するタイミングを決定する
ユーザーが期待する特定の機能のタイルを作成することをおすすめします 頻繁にアクセスするか、すばやくアクセスする必要があるか、またはその両方です。最も効果的なのは これらの両方の特性にマッチするタイルを使用すると、 おすすめします
たとえば、フィットネス アプリのタイルを作成して、ユーザーが ワークアウトセッションを簡単に開始できますただし、タイルの作成はおすすめしません。 ユーザーがワークアウトの全履歴を確認できるようにしました。
![フィットネス アプリタイルのユースケース](https://android-dot-devsite-v2-prod.appspot.com/static/develop/ui/views/images/use-cases-fitness-tiles.png?hl=ja)
タイルの見つけやすさと使いやすさを改善するには、 避けることをおすすめします。
アプリを起動するためにタイルを使用することは避けてください。アプリのショートカットまたは標準のショートカットを使用する ランチャーを使用してください。
1 回限りのユーザー操作にタイルを使用しないでください。アプリのショートカットまたは 通知を使用してください。
タイルを多用しすぎないようにしましょう。1 つのアプリにつき 2 つまでをおすすめします。以下を使用します: アプリのショートカットを使用してください。
情報を表示するタイルは使用せず、インタラクティブではない できます。代わりに通知またはウィジェットを使用してください。
タイルを作成する
タイルを作成するには、まず適切なタイルアイコンを作成してから、
アプリのマニフェスト ファイルで TileService
を作成して宣言します。
クイック設定のサンプルでは、設定方法の一例を紹介しています。 タイルを管理できます。
カスタム アイコンを作成する
クイックアイコンのタイルに表示されるカスタムアイコンを用意する必要があります。
設定パネル。(このアイコンは、TileService
を宣言するときに追加します。
(次のセクションで説明します)。アイコンは白色で点灯し、
透明な背景、24 x 24 dp、
VectorDrawable
。
![ベクター型ドローアブルの例](https://android-dot-devsite-v2-prod.appspot.com/static/develop/ui/views/images/vector-drawable.png?hl=ja)
タイルの目的を視覚的に示唆するアイコンを作成します。これにより、 タイルがニーズに合っているかどうかを簡単に確認できます。たとえば、サーバー モジュールを作成し、 ユーザーが開始できるフィットネス アプリのタイルのストップウォッチのアイコン 記録します。
TileService を作成して宣言する
TileService
クラスを拡張するタイルのサービスを作成します。
Kotlin
class MyQSTileService: TileService() { // Called when the user adds your tile. override fun onTileAdded() { super.onTileAdded() } // Called when your app can update your tile. override fun onStartListening() { super.onStartListening() } // Called when your app can no longer update your tile. override fun onStopListening() { super.onStopListening() } // Called when the user taps on your tile in an active or inactive state. override fun onClick() { super.onClick() } // Called when the user removes your tile. override fun onTileRemoved() { super.onTileRemoved() } }
Java
public class MyQSTileService extends TileService { // Called when the user adds your tile. @Override public void onTileAdded() { super.onTileAdded(); } // Called when your app can update your tile. @Override public void onStartListening() { super.onStartListening(); } // Called when your app can no longer update your tile. @Override public void onStopListening() { super.onStopListening(); } // Called when the user taps on your tile in an active or inactive state. @Override public void onClick() { super.onClick(); } // Called when the user removes your tile. @Override public void onTileRemoved() { super.onTileRemoved(); } }
アプリのマニフェスト ファイルで TileService
を宣言します。名前とラベルを追加
(前のセクションで作成したカスタム アイコン)の TileService
適切な権限を付与する必要があります。
<service
android:name=".MyQSTileService"
android:exported="true"
android:label="@string/my_default_tile_label" // 18-character limit.
android:icon="@drawable/my_default_icon_label"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
TileService を管理する
アプリ マニフェストで TileService
を作成して宣言したら、
状態を管理する必要があります。
TileService
は、バインドされたサービスです。TileService
がバインドされるタイミング
アプリがアプリによってリクエストされているかどうか、またはシステムがそれと通信する必要がある場合。典型的な
bound-serviceLifecycle には、次の 4 つのコールバック メソッドが含まれています。
onCreate()
、onBind()
、onUnbind()
、
onDestroy()
これらのメソッドは、
ライフサイクル フェーズに入ります。
TileService のライフサイクルの概要
バインドされたサービスのライフサイクルを制御するコールバックに加えて、
TileService
ライフサイクルに固有の他のメソッドを実装します。これらのメソッドは、
onCreate()
と onDestroy()
の外部で呼び出される場合があります。これは、Service
が
ライフサイクル メソッドと TileService
ライフサイクル メソッドは、2 つの
非同期スレッドを分離できます
TileService
ライフサイクルには、呼び出される次のメソッドが含まれます。
TileService
が新しいライフサイクル フェーズに入るたびに、システムにより次のように処理されます。
onTileAdded()
: このメソッドは、ユーザーが ユーザーがタイルを削除して再度追加した場合などです。 これが 1 回限りの初期化を行うのに最適なタイミングです。ただし、 初期化の条件をすべて満たしているとは言えません。onStartListening()
とonStopListening()
: これらのメソッドは、 アプリがタイルを更新するたびに呼び出され、頻繁に呼び出されます。「TileService
はonStartListening()
とonStopListening()
: アプリがタイルを変更して更新をプッシュできるようにします。onTileRemoved()
: このメソッドは、ユーザーが 。
リスニング モードを選択する
TileService
は、アクティブ モードまたは非アクティブ モードでリッスンします。おすすめの方法
(アプリ マニフェストで宣言する必要があります)のアクティブ モードを使用します。それ以外の場合は
TileService
は標準モードであり、宣言する必要はありません。
TileService
が onStartListening()
外に存在するとは想定しないでください。
メソッドの onStopListening()
ペア。
アクティブ モード(推奨)
状態をリッスンしてモニタリングする TileService
にアクティブ モードを使用する
プロセスです。アクティブ モードの TileService
が onTileAdded()
にバインドされている。
onTileRemoved()
、タップイベント、アプリプロセスからのリクエストがあった場合。
タイルの状態が通知されたときに TileService
に通知される場合は、アクティブ モードをおすすめします
独自のプロセスで更新する必要がありますタイルをアクティブにすると、
クイック設定パネルに毎回アクセスする必要がなくなるため、
ユーザーに見えるようになります
静的 TileService.requestListeningState()
メソッドを呼び出して、次のことができます。
リッスン状態の開始をリクエストし、
onStartListening()
。
アクティブ モードを宣言するには、META_DATA_ACTIVE_TILE
を
アプリのマニフェスト ファイルに追加します。
<service ...>
<meta-data android:name="android.service.quicksettings.ACTIVE_TILE"
android:value="true" />
...
</service>
非アクティブ モード
非アクティブ モードは、標準モードです。次の場合、TileService
は非アクティブ モードです。
タイルがユーザーに表示されるたびにバインドされます。つまり
TileService
が作成され、制御不能なタイミングで再度バインドされる可能性があります。これは、
ユーザーがタイルを表示していないときに、バインドを解除して破棄することもできます。
ユーザーがアプリを起動すると、アプリが onStartListening()
へのコールバックを受け取ります。
クイック設定パネル。Tile
オブジェクトは何回でも更新できます。
onStartListening()
~onStopListening()
の範囲で入力してください。
非アクティブ モードを宣言する必要はなく、単に
META_DATA_ACTIVE_TILE
をアプリのマニフェスト ファイルに追加します。
タイルの状態の概要
ユーザーが追加したタイルは、常に次のいずれかの状態になります。
STATE_ACTIVE
: オンまたは有効状態を示します。ユーザーは タイルを操作できます。(例: ユーザーが時間制限付きワークアウトを開始できるフィットネス アプリのタイルの場合)
STATE_ACTIVE
は、ユーザーがワークアウトを開始したことを意味します。 タイマーが実行中ですSTATE_INACTIVE
: オフ状態または一時停止状態を示します。ユーザーは タイルを操作できます。フィットネス アプリのタイルの例を再び使用すると、
STATE_INACTIVE
のタイルは次のようになります。 ユーザーがワークアウト セッションを開始していないものの、 実現しました。STATE_UNAVAILABLE
: 一時的に利用できない状態を示します。「 この状態ではユーザーはタイルを操作できません。たとえば、
STATE_UNAVAILABLE
のタイルは、タイルではないことを意味します。 なんらかの理由でユーザーに利用できなくなってしまいました。
システムは Tile
オブジェクトの初期状態のみを設定します。Tile
を設定しました。
その状態を維持します。
タイルのアイコンや背景が、
Tile
オブジェクト。STATE_ACTIVE
に設定された Tile
オブジェクトは最も暗く、
STATE_INACTIVE
と STATE_UNAVAILABLE
が徐々に明るくなります。正確な色相
メーカーとバージョンに固有です
![オブジェクトの状態を反映して色合いを調整した VPN タイル](https://android-dot-devsite-v2-prod.appspot.com/static/develop/ui/views/images/state-hues.png?hl=ja)
タイルを更新する
onStartListening()
へのコールバックを受け取ったら、タイルを更新できます。
タイルのモードに応じて、次の期限まで少なくとも 1 回はタイルを更新できます。
onStopListening()
へのコールバックを受信したとき。
アクティブ モードでは、タイルを 1 回だけ更新してから、
onStopListening()
へのコールバック。非アクティブ モードでは、タイルを次のように更新できます。
onStartListening()
~onStopListening()
の間で何度でも指定できます。
Tile
オブジェクトを取得するには、getQsTile()
を呼び出します。更新方法
Tile
オブジェクトの特定のフィールドに追加する場合は、次のメソッドを呼び出します。
タイルの設定が完了したら、updateTile()
を呼び出してタイルを更新する必要があります。
Tile
オブジェクトのフィールドに正しい値を設定します。これにより、
更新されたタイルデータを解析し、UI を更新します。
Kotlin
data class StateModel(val enabled: Boolean, val label: String, val icon: Icon) override fun onStartListening() { super.onStartListening() val state = getStateFromService() qsTile.label = state.label qsTile.contentDescription = tile.label qsTile.state = if (state.enabled) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE qsTile.icon = state.icon qsTile.updateTile() }
Java
public class StateModel { final boolean enabled; final String label; final Icon icon; public StateModel(boolean e, String l, Icon i) { enabled = e; label = l; icon = i; } } @Override public void onStartListening() { super.onStartListening(); StateModel state = getStateFromService(); Tile tile = getQsTile(); tile.setLabel(state.label); tile.setContentDescription(state.label); tile.setState(state.enabled ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE); tile.setIcon(state.icon); tile.updateTile(); }
タップを処理する
タイルがタイルに含まれる場合、ユーザーはタイルをタップしてアクションをトリガーできる
STATE_ACTIVE
または STATE_INACTIVE
。その後、システムはアプリの
onClick()
コールバック。
アプリは、onClick()
へのコールバックを受け取ると、ダイアログを起動するか、
バックグラウンド処理をトリガーしたり、タイルの状態を変更したりできます。
Kotlin
var clicks = 0 override fun onClick() { super.onClick() counter++ qsTile.state = if (counter % 2 == 0) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE qsTile.label = "Clicked $counter times" qsTile.contentDescription = qsTile.label qsTile.updateTile() }
Java
int clicks = 0; @Override public void onClick() { super.onClick(); counter++; Tile tile = getQsTile(); tile.setState((counter % 2 == 0) ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE); tile.setLabel("Clicked " + counter + " times"); tile.setContentDescription(tile.getLabel()); tile.updateTile(); }
ダイアログを起動する
showDialog()
をクリックすると、クイック設定パネルが折りたたまれ、ダイアログが表示されます。
追加の入力が必要な場合は、ダイアログを使用してアクションにコンテキストを追加します。
許可または拒否されます。
アクティビティを開始する
startActivityAndCollapse()
が、アプリの折りたたみ中にアクティビティを開始する
できます。アクティビティは、表示する詳細情報がある場合に便利です。
インタラクティブ性の高いアクションを
避けることができます
かなりのユーザー操作を必要とするアプリでは、 アクティビティはあくまで最後の手段です。代わりに、ダイアログや切り替えボタンの使用を検討してください。
タイルを長押しすると、[アプリ情報] 画面が表示されます。オーバーライドするには
代わりに、環境設定のアクティビティを起動して、
次のアクティビティのいずれかに<intent-filter>
:
ACTION_QS_TILE_PREFERENCES
。
Android API 28 以降では、PendingIntent
は
Intent.FLAG_ACTIVITY_NEW_TASK
がある。
if (Build.VERSION.SDK_INT >= 28) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
また、特定の Terraform 構成ファイルの AndroidManifest.xml
にフラグを追加することもできます。
Activity
セクション。
タイルを切り替え可能としてマークする
タイルが主に次の機能として機能する場合は、切り替え可能としてマークすることをおすすめします タイルの最も一般的な動作です。これにより、 タイルの動作に関する情報をオペレーティング システムに提供し、 全体的なアクセシビリティが向上します。
タイルを切り替え可能としてマークするには、TOGGLEABLE_TILE
メタデータを true
に設定します。
<service ...>
<meta-data android:name="android.service.quicksettings.TOGGLEABLE_TILE"
android:value="true" />
</service>
安全にロックされたデバイスで安全な操作のみを実行します
ロックされたデバイスでは、ロック画面の上部にタイルが表示されることがあります。もしタイルが
に機密情報が含まれている場合は、isSecure()
の値を確認して、
デバイスが安全な状態かどうかを判別し、TileService
が
それに応じて動作を変更します。
ロック中にタイル アクションを安全に実行できる場合は、startActivity()
を使用します。
ロック画面でアクティビティを起動できます。
タイル アクションが安全でない場合は、unlockAndRun()
を使用してユーザーにプロンプトを表示します。
ロックを解除できます。成功すると、システムによって
これに渡す Runnable
オブジェクト
メソッドを呼び出します。
タイルを追加するようユーザーに促す
タイルを手動で追加するには、ユーザーが以下の操作を行う必要があります。
- 下にスワイプしてクイック設定パネルを開きます。
- 編集ボタンをタップします。
- 目的のタイルが見つかるまで、デバイスのすべてのタイルをスクロールします。
- タイルを長押しして、アクティブなタイルのリストにドラッグします。
また、ユーザーはいつでもタイルを移動、削除できます。
Android 13 以降では、requestAddTileService()
メソッドを使用できます。
ユーザーが簡単にタイルをデバイスに追加できるようになります。この方法は
タイルをクイックビューに直接追加するよう、ユーザーに求めるメッセージが表示されます
設定パネル。プロンプトには、アプリケーション名、指定されたラベル、
追加できます
![クイック設定 Placement API プロンプト](https://android-dot-devsite-v2-prod.appspot.com/static/develop/ui/views/images/placement-api-user-prompt.png?hl=ja)
public void requestAddTileService (
ComponentName tileServiceComponentName,
CharSequence tileLabel,
Icon icon,
Executor resultExecutor,
Consumer<Integer> resultCallback
)
このコールバックには、タイルが追加されたかどうかの情報が含まれます。タイルは 存在する場合や、エラーが発生した場合は、追加されたかどうかが判断されます。
プロンプトを表示するタイミングと頻度は、ご自身の裁量で決定してください。水
requestAddTileService()
は、次のような状況でのみ呼び出すことをおすすめします。
タイルで実現されている機能をユーザーが初めて操作したとき。
システムは、特定のサービスに対するリクエストの処理を
ComponentName
: ユーザーが以前に十分な回数リクエストを拒否した場合。「
ユーザーがこれを取得するために使用される Context
から判断されます。
現在のユーザーと一致する必要があります。