Multi-Windowは、Androidで複数のアプリを同時に画面に表示できるマルチタスクモードのセットです。システムには3つのモードがあります。画面を2つに分割するSplit Screen、ミニウィンドウで動画を表示するPicture-in-Picture、大画面で自由なサイズのウィンドウを表示するFreeformです。Android Developers (2025)によると、画面幅600dp以上のデバイスではMulti-Windowのサポートが必須であり、すべての開発者は起こりうるウィンドウサイズの変更にアプリを適応させる必要があります。
重要なポイント
Multi-Windowは、Android 7.0 Nougat(API 24)で導入された機能で、2つ以上のアプリを同時に画面に表示できます。このモードは、タブレットや大画面デバイスの普及が進み、シングルタスクモードでは生産性が制限されるというGoogleの認識に応えたものです。
Android 7.0以前は、各アプリが全画面を占有し、アプリ間の切り替え時に前のアプリは最小化されていました。Multi-Windowはこのモデルを変えました。現在では、アプリはアクティブな状態を維持しながら画面の一部を占有できます。開発者にとっては、onConfigurationChangedとサイズ変更の処理が必須になります。
Android 12L(2022)では、Googleは大画面デバイスでMulti-Windowをデフォルトモードにしました。タブレット上のすべてのアプリは、マルチウィンドウを許可するモードで実行されます。唯一の例外は、マニフェストで明示的に禁止しているアプリです。
Split Screen — 最も一般的なモードです。画面は水平または垂直に2つに分割され、ユーザーは仕切りをドラッグします。スマートフォンとタブレットで利用可能。Overview(Recents)からアプリアイコンを上端または下端にドラッグして起動します。
Picture-in-Picture(PiP) — 動画やナビゲーションアプリ向けのモードです。コンテンツはフローティングミニウィンドウ(画面の約15〜25%)に表示され、移動可能です。Android 8.0+で利用可能。起動するには、ActivityでenterPictureInPictureMode()を使用します。
Freeform — デスクトップウィンドウマネージャーに似た、自由なサイズのウィンドウモードです。Android TVや一部のメーカーの大画面デバイス(Samsung DeX)で利用可能。アプリはタイトルバーとコントロールボタン付きのウィンドウで実行されます。
ユーザーがMulti-Windowを起動すると、Androidは各アプリに新しいActivityインスタンスを作成し、利用可能な画面スペースを分配します。Activityは別々のTaskに配置されますが、それらの間には仕切りがある同じStackViewを使用します。
システムはonConfigurationChanged()を通じて各Activityにサイズ変更を通知します。Activityがこのイベントを処理しない場合、再作成されます。Split Screenでは、ウィンドウの幅は220 dpまで減少する可能性があります。これはプラットフォームがサポートする最小幅です。
Androidでは、マニフェストでandroid:minWidthとandroid:minHeightを通じて最小幅を宣言できます。利用可能なスペースがこれらの値より小さい場合、Activityは一時停止します。
Multi-Windowをサポートするには、マニフェストでフラグandroid:resizeableActivity="true"を設定する必要があります。これは、ウィンドウが変更されたときにアプリがサイズを変更できることを意味します。Android 12L+ではデフォルトですべてのアプリがサイズ変更可能と見なされ、フラグは無視されます。
ウィンドウサイズが変更されると、Activityは再作成されるか(デフォルト)、マニフェストでconfigChanges="screenSize|smallestScreenSize"が指定されている場合はonConfigurationChangedでイベントを処理できます。状態の損失を避けるために、主要なActivityにはconfigChangesを指定することをお勧めします。
<activity
android:name=".MainActivity"
android:resizeableActivity="true"
android:configChanges="screenSize|smallestScreenSize|orientation" />
サイズ変更をサポートしないアプリの場合、Androidは警告ダイアログを表示します。この場合、マルチウィンドウモードに切り替えると、システムはActivityを終了し、再起動を促すスナックバーを表示することがあります。
Multi-Windowは標準のActivityライフサイクルを変更します。隣接するウィンドウで別のアプリがアクティブになると、現在のActivityはonPause()を受け取りますが、onStop()は受け取りません。フォーカスは失いますが、表示されたままです。これは重要です。動画プレーヤーはonStopではなくonPauseで再生を継続する必要があります。
開発者は状態を区別する必要があります。onPause + isInMultiWindowMode() = trueは、フォーカスの喪失のみを意味し、画面からの退出ではありません。動画やアニメーションの場合、これは再生を停止するのではなく、コントロール要素の選択を解除するシグナルです。
Multi-Windowを終了すると、onMultiWindowModeChanged()がonResume()の前に呼び出されます。これにより、ユーザーが操作を開始する前に、全画面モード用にインターフェースを再構築する機会が得られます。
第一のルールは状態を保存することです。マルチウィンドウモードでは、Activityはいつでも再作成される可能性があります。設定変更後も保持すべきすべてのデータには、ViewModelのSavedStateHandleまたはonSaveInstanceStateを使用してください。
第二のルールは、最小幅220 dpでテストすることです。この値はSplit Screenで最も狭いウィンドウと見なされます。インターフェースは読みやすく機能的である必要があります。要素が境界を超える場合は、Window Size Classを使用してレイアウトを切り替えてください。
第三のルールは、Multi-Windowで機能しない機能を無効にすることです。たとえば、画面が小さすぎるとカメラが利用できない場合があります。カメラやその他の全画面機能を起動する前に、isInMultiWindowMode()を確認してください。
よくある質問
マニフェストでandroid:resizeableActivity="false"を設定します。Android 12L+では、大画面デバイスではこのフラグは無視されるため、完全に禁止するにはandroid:maxAspectRatioを使用します。
ActivityからisInMultiWindowMode()を呼び出します。アプリがSplit Screen、PiP、Freeformで実行されている場合、このメソッドはtrueを返します。onMultiWindowModeChanged()を購読することもできます。
Android TVではPicture-in-Pictureモードのみ利用可能です。Split ScreenとFreeformはサポートされていません。テレビはメイン画面と隅のPiPウィンドウを使用します。
フォアグラウンドサービスはモードに関係なく動作を継続します。ただし、アプリがPiPに切り替わると、システムはリソースを節約するために一時的に実行を停止する場合があります。
Androidは、ClipDataとView.OnDragListenerを使用して、Multi-Windowのウィンドウ間でのドラッグアンドドロップをサポートしています。データは、FLAG_GRANT_READ_URI_PERMISSION付きのContentProviderまたはIntentを介して転送されます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。