オーディオ グラスとディスプレイ グラスは、種類によって機能が異なります。たとえば、すべてのオーディオ グラスとディスプレイ グラスは音声によるオーディオ エクスペリエンスを備えていますが、ディスプレイ グラスのみに、アプリが Jetpack Compose Glimmer で構築された UI を表示できるディスプレイがあります。
さまざまなデバイスでシームレスなユーザー エクスペリエンスを実現するには、グラス用の Activity を計画して、さまざまなデバイスの機能をチェックします。このアプローチでは、特定のデバイスをターゲットとする複数のアクティビティではなく、動作を適応させる 1 つのアクティビティを構築できるため、開発が簡素化されます。
予測アクティビティのライフサイクルを理解する
オーディオ グラスとディスプレイ グラス用に作成したアクティビティは、デバイス上で直接実行されるのではなく、ホストデバイス(ユーザーのスマートフォンなど)からデバイスに投影されます。この目的のために作成する専用のアクティビティは、投影アクティビティです。投影されたアクティビティのライフサイクルは、標準のアクティビティ ライフサイクルに基づいて構築されていますが、さまざまなタイプのオーディオ グラスやディスプレイ グラスの機能をサポートするいくつかの重要な違いもあります。
以下に、キーイベントの内訳を示します。音声グラスとディスプレイ グラスに投影されるアクティビティに固有のインタラクションには、コールアウトが付いています。
onCreate()- 投影されたアクティビティが作成されたときに呼び出されます。
- ここで、アプリの Jetpack Compose Glimmer UI とその他のコンポーネントを初期化します。
onStart()- 投影されたアクティビティが開始され、ユーザーがアプリを認識しているときに呼び出されます。
onResume()- 投影されたアクティビティがフォーカスを再取得したときに呼び出されます。アクティビティにフォーカスがある間は、操作可能であり、タッチパッドやボタンの入力を受け取ることができます。
- グラスを頭から外した後、再び装着したときに呼び出されます。
onPause()- 投影されたアクティビティがフォーカスを失ったが、ユーザーがアプリを認識しているときに呼び出されます。アクティビティがフォーカスを失っている間は、操作できず、入力の消費を停止します。
onStop()- システムが、ユーザーがアプリを認識しなくなったと判断したときに呼び出されます。
- グラスが頭から外された(外された)ときに呼び出されます。
onDestroy()- 投影されたアクティビティが破棄される直前に呼び出されます。このメソッドが呼び出されると、アクティビティに関連付けられているすべてのリソースが解放されます。
ディスプレイの状態が投影されたアクティビティのライフサイクルに与える影響を理解する
標準の Activity では、デバイスの画面がオフになるとライフサイクルの状態が変化し、通常は onPause() または onStop() に移行します。一方、投影されたアクティビティのライフサイクルは、グラスのディスプレイがオンまたはオフになっても変化しません。この動作は、ディスプレイがオフになっても、投影されたアクティビティが開始状態または再開状態で実行され続けることを意味します。これにより、アプリのオーディオ エクスペリエンスを中断することなく継続できます。
さまざまなシステム イベントやユーザー イベントによってトリガーされるその他のアクティビティ状態の変更は、通常どおりに動作します。
ユーザーの認知度が予測アクティビティに与える影響を把握する
ユーザーは、投影されたアクティビティが表示されていなくても、そのアクティビティを認識できます。認識とは、ユーザーがアプリのエクスペリエンスを認識して操作するすべての方法を指します。たとえば、次のようなものがあります。
- 音声、音声フィードバック、その他の音声キューを聞く。
- ユーザー向けの LED をトリガーするアプリのアクション(アプリがカメラやマイクにアクセスする場合のプライバシー インジケーターなど)。
このような状況では、ユーザーはディスプレイを見ていなくても、オーディオ グラスまたはディスプレイ グラスがアクティブで応答していることを認識しています。
- 投影されたアクティビティの
onStart()状態は、アクティビティがアクティブであることを意味します。 onResume()状態は、アクティビティが操作可能で、タッチパッド入力を受信できるか、プライマリ入力ディスパッチを受信していることを意味します。
ユーザーがアプリを認識している限り、アクティビティはアクティブな状態を維持し、フォアグラウンドに表示されます。システムが短時間で認識のシグナルを検出しない場合、システムはアクティビティをフォアグラウンドから削除し、最終的に onStop() をトリガーします。
予測アクティビティと予測コンテキストについて
オーディオ グラスとディスプレイ グラスは、ユーザーのスマートフォンの機能を拡張するコネクテッド デバイスとして扱われます。投影されたコンテキストは、デバイスを認識する Context です。これにより、アプリはスマートフォンのハードウェアではなく、接続されたメガネ型デバイスのハードウェア(センサーやカメラなど)を操作できます。オーディオ グラスとディスプレイ グラス向けのエクスペリエンスを開発する際、アプリは投影されたコンテキストを使用してグラスのハードウェアにアクセスする必要があります。
呼び出し元のアクティビティのコンテキストに応じて、投影されたコンテキストがアプリに自動的に付与されることがあります。
投影されたアクティビティの場合: アプリのコードが投影されたアクティビティ内から実行されている場合、そのアクティビティ コンテキストはすでに投影されたコンテキストです。このシナリオでは、そのアクティビティ内で行われた呼び出しは、すでにグラスのハードウェアにアクセスできます。
電話アプリまたはサービスの場合: 投影されたアクティビティ以外のアプリの一部(電話アクティビティやサービスなど)がグラスのハードウェアにアクセスする必要がある場合は、投影されたコンテキストを明示的に取得する必要があります。これを行うには、
createProjectedDeviceContext()メソッドを使用します。
詳細については、投影されたコンテキストを使用してオーディオ グラスとディスプレイ グラスのハードウェアにアクセスするをご覧ください。
デバイス対応 API について
一部の標準 Android API は、呼び出し元のアクティビティの Context に応じて、アクセスするデバイスのハードウェアを変更します。これらの API は、投影されたコンテキストを受け取ると、ホスト スマートフォン デバイスのハードウェアではなく、グラスのハードウェアにアクセスします。
CameraManager: グラスのカメラにアクセスします。SensorManager: グラスからセンサーデータ(ジャイロスコープや加速度計のデータなど)を取得します。AudioManager: グラスの音声ストリーム、音量、ルーティングを管理します。