デスクトップ ウィンドウをサポートする

デスクトップ ウィンドウを使用すると、サイズ変更可能なアプリ ウィンドウで複数のアプリを同時に実行し、デスクトップのような多彩なエクスペリエンスを実現できます。

図 1 は、デスクトップ ウィンドウが有効になっている画面の構成を示しています。注意事項:

  • ユーザーは複数のアプリを並べて同時に実行できます。
  • タスクバーはディスプレイの下部に固定され、実行中のアプリが表示されます。ユーザーはアプリを固定して、すばやくアクセスできます。
  • カスタマイズ可能な新しいヘッダーバーが各ウィンドウの上部に表示され、最小化や最大化などのコントロールが配置されます。
図 1. タブレットでのデスクトップ ウィンドウ。

デフォルトでは、Android タブレットでアプリは全画面表示で開きます。デスクトップ ウィンドウでアプリを起動するには、画面上部のウィンドウ ハンドルを長押しし、図 2 のようにハンドルを UI 内にドラッグします。

アプリがパソコンのウィンドウで開いている場合、他のアプリもパソコンのウィンドウで開きます。

図 2.アプリ ウィンドウのハンドルを長押ししてドラッグすると、デスクトップ ウィンドウ モードになります。

ハンドルをタップまたはクリックしたときにウィンドウ ハンドルの下に表示されるメニューから、またはキーボード ショートカット Meta キー(Windows、Command、検索)+ Ctrl + 下矢印を使用して、デスクトップ ウィンドウを起動することもできます。

ユーザーは、アクティブなウィンドウをすべて閉じるか、デスクトップ ウィンドウの上部にあるウィンドウ ハンドルをつかんでアプリを画面上部にドラッグすることで、デスクトップ ウィンドウ表示を終了します。キーボード ショートカット Meta+H でも、デスクトップ ウィンドウを終了して、アプリを全画面表示に戻すことができます。

パソコンのウィンドウ表示に戻るには、[最近] 画面でパソコンのスペース タイルをタップまたはクリックします。

サイズ変更と互換モード

デスクトップ ウィンドウでは、向きをロックしたアプリのサイズを自由に変更できます。つまり、アクティビティが縦向きにロックされている場合でも、ユーザーはアプリを横向きのウィンドウにサイズ変更できます。

図 3. 縦向き限定のアプリのウィンドウを横向きにサイズ変更する。

サイズ変更不可として宣言されたアプリ(つまり、resizeableActivity = false)は、同じアスペクト比を維持しながら UI がスケーリングされます。

図 4. サイズ変更不可のアプリの UI は、ウィンドウのサイズ変更に応じてスケーリングされます。

向きをロックするか、サイズ変更不可として宣言されているカメラアプリでは、カメラのビューファインダーが特別に処理されます。ウィンドウは完全にサイズ変更できますが、ビューファインダーのアスペクト比は同じままです。アプリが常に縦向きまたは横向きで実行されることを前提として、プレビューまたはキャプチャ画像の向きやアスペクト比の誤算につながるハードコードやその他の前提条件を設定しているため、画像が引き伸ばされたり、横向きになったり、上下逆になったりする。

アプリが完全にレスポンシブなカメラ ビューファインダーを実装する準備ができるまで、特別な処理により、より基本的なユーザー エクスペリエンスを提供して、誤った前提が原因で発生する影響を軽減します。

カメラアプリの互換モードの詳細については、デバイスの互換モードをご覧ください。

図 5. カメラのビューファインダーは、ウィンドウのサイズ変更に応じてアスペクト比を維持します。

カスタマイズ可能なヘッダーの切れ目

パソコンのウィンドウ処理で実行されるすべてのアプリには、没入モードの場合でもヘッダーバーが表示されます。
アプリのコンテンツがヘッダーバーに隠れていないことを確認します。 ヘッダーバーは字幕バーのインセット タイプ(androidx.compose.foundation.layout.WindowInsets.Companion.captionBar())です。ビューでは、システムバーの一部である WindowInsets.Type.captionBar() です。

インセットの処理について詳しくは、アプリでコンテンツをエッジ ツー エッジで表示し、Compose でウィンドウ インセットを処理するをご覧ください。

ヘッダーバーもカスタマイズできます。Android 15 では、ヘッダーバーを透明にしてアプリがヘッダーバー内にカスタム コンテンツを描画できるようにする外観タイプ APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND が導入されました。

アプリは、システム キャプション要素(閉じるボタンと最大化ボタン)を除き、コンテンツの上部をキャプション バーのように見せるためのスタイル設定を行う必要があります。システム キャプション要素は、アプリの上部にある透明なキャプション バーにシステムによって描画されます。

アプリは、ステータスバーとナビゲーション バーの切り替え方法と同様に、APPEARANCE_LIGHT_CAPTION_BARS を使用してライトモードとダークモードの字幕内のシステム要素の表示を切り替えることができます。

Android 15 では、アプリが字幕バーの切り欠きをより詳細にイントロスペクトできるようにする WindowInsets#getBoundingRects() メソッドも導入されました。システムは、システム要素が描画される領域と、システム要素が重ねられることなくアプリがカスタム コンテンツを配置できる未使用の領域を区別できます。

API から返される Rect オブジェクトのリストは、避けるべきシステム領域を示します。残りのスペース(キャプション バーの枠線から長方形を減算して計算)は、システム要素と重複することなくアプリが描画でき、入力を受け取ることができるスペースです。

カスタム ヘッダーを実装する前後の Chrome。
図 6. カスタム ヘッダーの実装前後の Chrome。

マルチタスクとマルチインスタンスのサポート

マルチタスクはデスクトップ ウィンドウの中心的な機能であり、アプリの複数のインスタンスが許可されると、ユーザーの生産性が大幅に向上します。

Android 15 では、PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI が導入されました。アプリは、アプリを複数のインスタンスで起動できるように、システム UI を表示するように設定できます。

ドラッグ ジェスチャーでアプリ インスタンスを管理する

マルチ ウィンドウ モードでは、ユーザーはビュー要素をアプリのウィンドウからドラッグして、新しいアプリ インスタンスを開始できます。同じアプリのインスタンス間で要素を移動することもできます。

図 7. デスクトップ ウィンドウからタブをドラッグして、Chrome の新しいインスタンスを起動します。

Android 15 では、ドラッグ&ドロップの動作をカスタマイズするための 2 つのフラグが導入されています。

  • DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG: ドロップを処理する表示ウィンドウがない場合、処理されないドラッグをシステムに委任して開始する必要があることを示します。このフラグを使用する場合、呼び出し元は、起動するアクティビティへの不変の IntentSender を含む ItemClipData に指定する必要があります(ClipData.Item.Builder#setIntentSender() を参照)。システムは、現在の画面サイズやウィンドウ モードなどの要素に基づいて、インテントを起動するかどうかを決定できます。システムがインテントを起動しない場合は、通常のドラッグ&ドロップ フローでインテントがキャンセルされます。

  • DRAG_FLAG_GLOBAL_SAME_APPLICATION: ドラッグ オペレーションでウィンドウ境界をまたぐことができることを示します(同じアプリの複数のインスタンスで使用)。

    このフラグを設定して startDragAndDrop() が呼び出されると、同じアプリに属する表示可能なウィンドウのみが、ドラッグ オペレーションに参加してドラッグされたコンテンツを受信できます。

図 8. Chrome アプリの 2 つのインスタンス間でタブを移動します。

その他の最適化

アプリの起動をカスタマイズし、デスクトップのウィンドウから全画面にアプリを切り替えます。

デフォルトのサイズと位置を指定する

サイズ変更が可能なアプリでも、ユーザーに価値を提供するために大きなウィンドウが必要となるとは限りません。ActivityOptions#setLaunchBounds() メソッドを使用して、アクティビティの起動時にデフォルトのサイズと位置を指定できます。

デスクトップ スペースから全画面表示に切り替える

アプリは Activity#requestFullScreenMode() を呼び出すことで全画面表示にできます。この方法では、デスクトップのウィンドウからアプリを直接全画面表示します。