接続型ディスプレイは、デスクトップのウィンドウ処理を標準のスマートフォンに拡張し、モバイル デバイスから大画面にアクセスできるようにします。この機能により、アプリの操作性とユーザーの生産性が向上します。
接続されたディスプレイには、デスクトップ ウィンドウの独自の機能がすべて適用されます。スマートフォンをディスプレイに接続すると、スマートフォンの状態は変更されず、接続されたディスプレイで空白のデスクトップ セッションが開始されます。デバイスとディスプレイは 2 つの個別のシステムとして機能し、ディスプレイごとに固有のアプリがあります。
タブレットなど、デスクトップ ウィンドウ対応デバイスを外部モニターに接続すると、デスクトップ セッションは両方のディスプレイに拡張されます。2 つのディスプレイは 1 つの連続したシステムとして機能します。この設定では、ウィンドウ、コンテンツ、カーソルを 2 つのディスプレイ間で自由に移動できます。
接続されたディスプレイを効果的にサポートするには、アプリの設計と実装のいくつかの側面に注意する必要があります。以下のベスト プラクティスに沿って作成すると、スムーズで生産性の高いユーザー エクスペリエンスを実現できます。
動的ディスプレイの変更を処理する
多くのアプリは、Display
オブジェクトとその特性がアプリのライフサイクル中に変更されないことを前提として構築されています。ただし、ユーザーが外部モニターを接続または切断したり、アプリ ウィンドウをディスプレイ間で移動したりすると、アプリのコンテキストまたはウィンドウに関連付けられている基盤となる Display
オブジェクトが変更される可能性があります。ディスプレイのプロパティ(サイズ、解像度、リフレッシュ レート、HDR のサポート、密度など)はすべて異なる場合があります。たとえば、スマートフォンの画面に基づいて値をハードコードすると、外部ディスプレイでレイアウトが崩れる可能性があります。
外部ディスプレイのピクセル密度が大きく異なる場合もあります。アプリが密度の変化に正しく応答するようにする必要があります。これには、レイアウトに密度非依存ピクセル(dp)を使用する、密度に固有のリソースを提供する、UI が適切にスケーリングされるようにする、といったことが含まれます。
適切なコンテキストを使用する
マルチディスプレイ環境では適切なコンテキストを使用することが非常に重要です。リソースにアクセスするときのアクティビティ コンテキスト(表示される)は、アプリ コンテキスト(表示されない)とは異なります。
アクティビティ コンテキストはディスプレイに関する情報を含んでおり、アクティビティの表示領域に合わせて常に調整されます。これにより、アプリのディスプレイ密度やウィンドウ指標に関する正しい情報を取得できます。現在のウィンドウまたはディスプレイに関する情報を取得するには、必ずアクティビティ コンテキスト(または別の UI ベースのコンテキスト)を使用する必要があります。アクティビティ コンテキストは、その情報を使用するシステム API にも影響を及ぼします。
ディスプレイ情報を取得する
Display
クラスを使用して、ディスプレイのサイズやディスプレイが安全かどうかを示すフラグなど、特定のディスプレイに関する情報を取得できます。使用可能なディスプレイを取得するには、DisplayManager
システム サービスを使用します。
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = displayManager.getDisplays()
アクティビティの起動と構成を管理する
接続されたディスプレイでは、アプリは起動時や別のアクティビティの作成時に、どのディスプレイで実行するかを指定できます。この動作は、マニフェスト ファイルで定義したアクティビティの起動モード、またはアクティビティを起動するエンティティが設定したインテント フラグやオプションによって異なります。
アクティビティをセカンダリ ディスプレイに移動すると、アプリでコンテキストの更新、ウィンドウのサイズ変更、構成とリソースの変更が行われることがあります。アクティビティで構成の変更に対処する場合、onConfigurationChanged()
で通知されます。それ以外の場合は、アクティビティが再起動されます。
アクティビティに対して選択した起動モードで複数のインスタンスが許容されている場合、セカンダリ画面で起動すると、アクティビティの新しいインスタンスが作成されることがあります。両方のアクティビティが同時に再開されるため、特定のマルチタスク シナリオで役立ちます。
特定のディスプレイでアクティビティを起動するには、ActivityOptions
を使用します。
val options = ActivityOptions.makeBasic()
options.setLaunchDisplayId(targetDisplay.displayId)
startActivity(intent, options.toBundle())
デバイスの許可リストを避ける
アプリによっては、許可リストまたは組み込みディスプレイ サイズの確認によって、大画面の UI と機能を特定のデバイスに制限している場合があります。コネクテッド ディスプレイでは、ほぼすべての新しいデバイスを大画面に接続できるため、このアプローチは効果的ではありません。さまざまな画面サイズと密度にレスポンシブで適応できるようにアプリを設計します。
外部周辺機器をサポートする
ユーザーは外部ディスプレイに接続するときに、よりデスクトップに近い環境を構築することがよくあります。多くの場合、外付けキーボード、マウス、トラックパッド、ウェブカメラ、マイク、スピーカーを使用します。アプリがこれらの周辺機器とシームレスに動作するようにする必要があります。これには、キーボード ショートカットの処理、マウス ポインタの操作の管理、外部カメラやマイクの正しいサポート、オーディオ出力ルーティングの尊重が含まれます。詳しくは、大画面での入力の互換性をご覧ください。
ユーザーの生産性を高める
コネクテッド ディスプレイは、ユーザーの生産性を大幅に向上させる機会を提供します。これで、パソコン向けアプリケーションに匹敵するエクスペリエンスを提供できるモバイルアプリを構築するためのツールが揃いました。ユーザーの生産性を高めるため、次の機能を実装することを検討してください。
- ユーザーが同じアプリの複数のインスタンスを開くことを許可します。これは、ドキュメントの比較、さまざまな会話の管理、複数のファイルの同時表示などのタスクに非常に役立ちます。
- ユーザーがドラッグ&ドロップでアプリ内外でリッチデータを共有できるようにします。
- 堅牢な状態管理システムを実装して、構成の変更後もユーザーがワークフローを維持できるようにします。
これらのガイドラインに沿って、提供されているコードサンプルを利用することで、接続されたディスプレイにシームレスに適応するアプリを作成でき、ユーザーに豊かで生産性の高いエクスペリエンスを提供できます。