アプリ用のカスタム クイック設定タイルを作成する

クイック設定は、クイック設定パネルに表示されるタイルで、 ユーザーがタップして、繰り返すタスクをすばやく完了できるようにします。 アプリでは、TileService を使用してユーザーにカスタムタイルを提供できます。 クラスと、Tile オブジェクトを使用してタイルの状態を追跡します。たとえば アプリが提供する VPN をユーザーが有効にしたり、 オフにします。

VPN タイルが表示されたクイック設定パネル
  オンとオフ
図 1. VPN タイルが表示されたクイック設定パネル

タイルを作成するタイミングを決定する

ユーザーが期待する特定の機能のタイルを作成することをおすすめします 頻繁にアクセスするか、すばやくアクセスする必要があるか、またはその両方です。最も効果的なのは これらの両方の特性にマッチするタイルを使用すると、 おすすめします

たとえば、フィットネス アプリのタイルを作成して、ユーザーが ワークアウトセッションを簡単に開始できますただし、タイルを作成し、 ユーザーがワークアウトの全履歴を確認できるようにしました。

フィットネス アプリタイルのユースケース
図 2. フィットネス アプリのタイルの推奨例と推奨されない例

タイルの見つけやすさと使いやすさを改善するには、 避けることをおすすめします。

  • アプリを起動するためにタイルを使用することは避けてください。アプリのショートカットまたは標準のショートカットを使用する ランチャーを使用してください。

  • 1 回限りのユーザー操作にタイルを使用しないでください。アプリのショートカットまたは 通知を使用してください。

  • タイルを多用しすぎないようにしましょう。1 つのアプリにつき 2 つまでをおすすめします。以下を使用します: アプリのショートカットを使用してください。

  • 情報を表示するタイルは使用せず、インタラクティブではない できます。代わりに通知またはウィジェットを使用してください。

タイルを作成する

タイルを作成するには、まず適切なタイルアイコンを作成してから、 アプリのマニフェスト ファイルで TileService を作成して宣言します。

クイック設定のサンプルでは、設定方法の一例を紹介しています。 タイルを管理できます。

カスタム アイコンを作成する

クイックアイコンのタイルに表示されるカスタムアイコンを用意する必要があります。 設定パネル。(このアイコンは、TileService を宣言するときに追加します。 (次のセクションで説明します)。アイコンは白色で点灯し、 透明な背景、24 x 24 dp、 VectorDrawable

ベクター型ドローアブルの例
図 3. ベクター型ドローアブルの例

タイルの目的を視覚的に示唆するアイコンを作成します。これにより、 タイルがニーズに合っているかどうかを簡単に確認できます。たとえば、サーバー モジュールを作成し、 ユーザーが開始できるフィットネス アプリのタイルのストップウォッチのアイコン 記録します。

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(): これらのメソッドは、 アプリがタイルを更新するたびに呼び出され、頻繁に呼び出されます。「 TileServiceonStartListening()onStopListening(): アプリがタイルを変更して更新をプッシュできるようにします。

  • onTileRemoved(): このメソッドは、ユーザーが 。

で確認できます。

リスニング モードを選択する

TileService は、アクティブ モードまたは非アクティブ モードでリッスンします。おすすめの方法 (アプリ マニフェストで宣言する必要があります)のアクティブ モードを使用します。それ以外の場合は TileService は標準モードであり、宣言する必要はありません。

TileServiceonStartListening() 外に存在するとは想定しないでください。 メソッドの onStopListening() ペア。

状態をリッスンしてモニタリングする TileService にアクティブ モードを使用する プロセスです。アクティブ モードの TileServiceonTileAdded() にバインドされている。 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_INACTIVESTATE_UNAVAILABLE が徐々に明るくなります。正確な色相 メーカーとバージョンに固有です

オブジェクトの状態を反映して色合いを調整した VPN タイル
図 4. タイルの状態(それぞれアクティブ、非アクティブ、利用不可の状態)を反映するために色合いを調整したタイルの例。

タイルを更新する

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 以降では、PendingIntentIntent.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 オブジェクト メソッドを呼び出します。

タイルを追加するようユーザーに促す

タイルを手動で追加するには、ユーザーが以下の操作を行う必要があります。

  1. 下にスワイプしてクイック設定パネルを開きます。
  2. 編集ボタンをタップします。
  3. 目的のタイルが見つかるまで、デバイスのすべてのタイルをスクロールします。
  4. タイルを長押しして、アクティブなタイルのリストにドラッグします。

また、ユーザーはいつでもタイルを移動、削除できます。

Android 13 以降では、requestAddTileService() メソッドを使用できます。 ユーザーが簡単にタイルをデバイスに追加できるようになります。この方法は タイルをクイックビューに直接追加するよう、ユーザーに求めるメッセージが表示されます 設定パネル。プロンプトには、アプリケーション名、指定されたラベル、 追加できます

<ph type="x-smartling-placeholder">
</ph> クイック設定 Placement API プロンプト
図 5.Quick Settings Placement API プロンプト。
public void requestAddTileService (
  ComponentName tileServiceComponentName,
  CharSequence tileLabel,
  Icon icon,
  Executor resultExecutor,
  Consumer<Integer> resultCallback
)

このコールバックには、タイルが追加されたかどうかの情報が含まれます。タイルは 存在する場合や、エラーが発生した場合は、追加されたかどうかが判断されます。

プロンプトを表示するタイミングと頻度は、ご自身の裁量で決定してください。水 requestAddTileService() は、次のような状況でのみ呼び出すことをおすすめします。 タイルで実現されている機能をユーザーが初めて操作したとき。

システムは、特定のサービスに対するリクエストの処理を ComponentName: ユーザーが以前に十分な回数リクエストを拒否した場合。「 ユーザーがこれを取得するために使用される Context から判断されます。 現在のユーザーと一致する必要があります。