マルチウィンドウ モードのサポート

マルチ ウィンドウ モードでは、複数のアプリで同じ画面を同時に共有できます。 アプリを横に並べて表示することも、上下に並べて表示することもできます(分割画面モード)。1 つのアプリを並べて表示することもできます。 他のアプリの上に重ねて表示される小さなウィンドウ(ピクチャー イン ピクチャー モード)や、 移動やサイズ変更が可能な個別のウィンドウ(フリーフォーム モード)に表示できます。

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
図 1. 分割画面モードで 2 つのアプリを並べて表示します。

ユーザー エクスペリエンスは、Android のバージョンとデバイスの種類によって異なります。

  • Android 7.0(API レベル 24)で、小画面に分割画面モードが導入されました。 一部のデバイスでピクチャー イン ピクチャー モードを利用できます。

    • 分割画面モード: 画面全体に 2 つのアプリが表示されます。 横に並べたり上下に並べたりできますユーザーは分割線をドラッグできます 2 つのアプリを分けて、一方のアプリをサイズが大きくし、もう一方を小さくします。

    • ピクチャー イン ピクチャー モードでは動画の再生を続行できます (ピクチャー イン ピクチャーのサポートをご覧ください)。

    • ユーザーが各アクティビティのサイズを自由に変更できる自由形式モードでは、 大画面デバイス メーカーが有効にする必要があります。

      次のように指定することで、アプリでのマルチウィンドウ モードの処理方法を構成できます。 アクティビティの最小許容サイズ。スペースを無効にしたり 設定することで、アプリのマルチ ウィンドウ モードを resizeabableActivity="false": システムが常に 全画面表示にできます

  • Android 8.0(API レベル 26)では、ピクチャー イン ピクチャー モードが小さいモードに拡張されました。 。

  • Android 12(API レベル 31)では、マルチウィンドウ モードが標準の動作になります。

    • 大画面または拡大のウィンドウ サイズクラス)では、 アプリに関係なく、マルチウィンドウ モードのすべてのアプリをサポート できます。resizeableActivity="false" の場合、アプリは 互換モードを使用できます。

    • 小画面コンパクト ウィンドウ サイズクラス)では、システムは アクティビティの minWidthminHeight を使用して、 マルチウィンドウ モードで実行できます。条件 resizeableActivity="false"、アプリは実行できません。 マルチ ウィンドウ モードを、最小の幅と高さに関係なく常に適用できるようにします。

分割画面モード

ユーザーは次の操作を行うことで、分割画面モードを有効にできます。

  1. 履歴画面を開きます。
  2. スワイプしてアプリをビューに表示します。
  3. アプリのタイトルバーにあるアプリアイコンをタップします。
  4. [分割画面] メニュー オプションを選択します。
  5. 履歴画面から別のアプリを選択するか、履歴画面を閉じて 別のアプリを実行する

ユーザーは、ウィンドウ分割線を画面の上下左右いずれかの端までドラッグすることで、分割画面モードを終了できます。

隣接するデバイスを発射

アプリがインテントを通じてコンテンツにアクセスする必要がある場合は、 FLAG_ACTIVITY_LAUNCH_ADJACENT: 隣にコンテンツが表示されます。 クリックします。

FLAG_ACTIVITY_LAUNCH_ADJACENT は Android 7.0(API レベル 24)で導入され、 分割画面モードで実行されているアプリで、隣接するアクティビティでアクティビティを起動できるようにする クリックします。

Android 12L(API レベル 32)以降では、このフラグの定義が アプリが全画面表示され、分割画面モードを有効にしてから起動する 隣接するウィンドウで アクティビティを表示することもできます

隣接するアクティビティを起動するには、FLAG_ACTIVITY_LAUNCH_ADJACENTFLAG_ACTIVITY_NEW_TASK と組み合わせて使用すると、次のようになります。

Kotlin

fun openUrlInAdjacentWindow(url:
String) { Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url)
addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK)
 }.also { intent -> startActivity(intent) } }

Java

public void openUrlInAdjacentWindow(String url) {
  Intent intent = new Intent(Intent.ACTION_VIEW);
  intent.setData(Uri.parse(url));
  intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);
}

マルチ ウィンドウ モードでのアクティビティのライフサイクル

マルチウィンドウ モードは、アクティビティのライフサイクルを変更しません。ただし、 複数のウィンドウでアプリの再開状態は、 Android。

複数のアプリの再開

Android 10(API レベル 29)以降では、複数のアプリの再開がサポートされています。 デバイスがマルチウィンドウ内にある場合、アクティビティは RESUMED 状態のままである モード。透明なアクティビティが一番上にある場合は、アクティビティを一時停止できます。 フォーカス可能でない場合。たとえば、このアクティビティは ピクチャー イン ピクチャー モードにします。または、すべてのアクティビティにフォーカスが たとえば、通知ドロワーが開いているかなどです。onStop() メソッドは通常どおりに動作する: このメソッドは、アクティビティが削除されるたびに呼び出されます。 画面に表示されます。

複数のアプリの再開は、Android 9(API レベル)を搭載した一部のデバイスでも利用できます。 28)。Android 9 デバイスで複数のアプリの再開を有効にするには、次のマニフェストを追加します。 metadata:

<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />

デバイスがこのマニフェスト メタデータをサポートしているかどうかを確認するには、デバイスの仕様をご覧ください。

Android 9

Android 9(API レベル 28)以前のマルチウィンドウ モードでは、ある時点でアクティブなのは、ユーザーが最後に操作したアクティビティのみです。この 最上位とみなされ、RESUMED 内の唯一のアクティビティである state.その他の表示アクティビティはすべて STARTED ですが、RESUMED ではありません。 ただし、システムは、再開はされていないにもかかわらず表示されるアクティビティに対して高い頻度で付与します。 表示されないアクティビティよりも優先順位が高くなります。ユーザーがいずれかの そのアクティビティが再開され、以前の最上位 アクティビティが STARTED 状態になります。

1 つのアクティブ アプリ プロセス内に複数のアクティビティがある場合、Z オーダーが最も高いアクティビティが再開され、他のアクティビティは一時停止されます。

構成の変更

ユーザーがアプリをマルチウィンドウ モードにすると、 変更します。これは、ユーザーがアプリのサイズを変更するか、アプリを元に戻す場合にも発生します。 クリックします。

基本的に、この変更はアクティビティのライフサイクルに デバイスが縦向きから縦向きに切り替わったことを 横向き。ただし、スペースの代わりにアプリのサイズが変更される スワップされているだけですアクティビティは構成の変更自体を処理できる。または アプリがアクティビティを破棄して再作成することを 作成します

ユーザーがウィンドウのサイズを変更して、高さまたは幅を拡大した場合、システムはユーザー操作に合わせてアクティビティのサイズを変更し、必要に応じて構成の変更を実行します。新しく公開された領域をアプリが描画するのに時間がかかる場合、 これらの領域は windowBackground 属性またはデフォルト windowBackgroundFallback スタイル属性。

リソースへの排他的アクセス

複数のアプリの再開機能をサポートするには、 onTopResumedActivityChanged() ライフサイクル コールバック。

コールバックは、アクティビティがトップの再開アクティビティを獲得または喪失したときに呼び出されます。 位置は、アクティビティが共有シングルトン リソースを使用する場合に重要です。 マイクやカメラなどです。

Kotlin

override fun
onTopResumedActivityChanged(topResumed: Boolean) { if (topResumed) { // Top
resumed activity. // Can be a signal to re-acquire exclusive resources. } else {
// No longer the top resumed activity. } }

Java

@Override
public void onTopResumedActivityChanged(boolean topResumed) {
  if (topResumed) {
      // Top resumed activity.
      // Can be a signal to re-acquire exclusive resources.
  } else {
      // No longer the top resumed activity.
  }
}

アプリはその他の理由(共有ハードウェアの取り外しなど)でリソースを失うこともあります。

いずれにしても、アプリは使用可能なリソースに影響するイベントと状態変化にスムーズに対処する必要があります。

カメラを使用するアプリの場合 CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() は、カメラにアクセスするのにちょうどよいタイミングである可能性があるというヒントを示します。 このメソッドは、Android 10(API レベル 29)以降で使用できます。

resizeableActivity=false は専用カメラを保証するものではありません カメラを使用する他のアプリを他のディスプレイで開けるため。

図 2. カメラがマルチ ウィンドウ モードになっています。

アプリがフォーカスを喪失したときにカメラを解放する必要はありません。 たとえば、ユーザーが操作している間にカメラ プレビューを続行できます。 新しくフォーカスされた最上位の再開アプリとともに 表示されます1 つのバージョンを 最上位で再開されたアプリではないときにカメラを実行する必要がある場合に、 接続解除のケースを適切に 変更する必要があります最上位で再開されたアプリが カメラを開くことができ、アプリはアクセスできなくなります。アプリは アプリがフォーカスが戻ったときに通知を受け取れます。

アプリが CameraDevice.StateCallback#onDisconnected() を受け取った後 コールバックが呼び出されると、カメラデバイスでの後続の呼び出しは CameraAccessException.

マルチディスプレイ

Android 10(API レベル 29)は、セカンダリ ディスプレイ上のアクティビティをサポートしています。アクティビティが複数のディスプレイを持つデバイスで実行されている場合、ユーザーはディスプレイ間でアクティビティを移動できます。複数のアプリの再開の適用対象 マルチスクリーン対応ですいくつかのアクティビティでは、ユーザー入力を できます。

アプリは、起動時や別のアクティビティの作成時に、どのディスプレイで実行するかを指定できます。この動作は、マニフェスト ファイルで定義したアクティビティの起動モード、またはアクティビティを起動するエンティティが設定したインテント フラグやオプションによって異なります。詳細については、ActivityOptions クラスをご覧ください。 表示されます。

アクティビティをセカンダリ ディスプレイに移動すると、コンテキストの更新、ウィンドウのサイズ変更、構成とリソースの変更が行われることがあります。アクティビティが 処理されるため、アクティビティが構成の変更を onConfigurationChanged()、そうでない場合、アクティビティは再起動されます。

アクティビティは、onCreate() で現在のディスプレイを確認する必要があります。 構成の変更を処理する場合は onConfigurationChanged()。ディスプレイが変更されたときは、リソースとレイアウトを必ず更新するようにします。

アクティビティに対して選択した起動モードで複数のインスタンスが許可されている場合、 アクティビティの新しいインスタンスを作成できます。両方のアクティビティ 同時に再開されます。

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph> 図 3. 複数のディスプレイに表示されたアクティビティの複数のインスタンス

また、Google に導入されたマルチディスプレイ API もご覧ください。 Android 8.0 では

アクティビティとアプリのコンテキスト

マルチディスプレイでは適切なコンテキストを使用することが非常に重要です。リソースにアクセスするときのアクティビティ コンテキスト(表示される)は、アプリ コンテキスト(表示されない)とは異なります。

アクティビティ コンテキストはディスプレイに関する情報を含んでおり、アクティビティの表示領域に合わせて常に調整されます。これにより、 画面密度やウィンドウ指標に関する正しい情報を入手し、 。常にアクティビティ コンテキスト(または別の UI ベースの context)を使用して現在のウィンドウやディスプレイに関する情報を取得できます。また、 コンテキストからの情報を使用する一部のシステム API に影響します(たとえば、 トーストの概要をご覧ください)。

リソースとコンテキストは、アクティビティのウィンドウ構成と親ディスプレイによって定義されます。現在のディスプレイは次のように取得します。

Kotlin

val activityDisplay = activity.getDisplay()

Java

Display activityDisplay = activity.getDisplay();

現在のアクティビティのウィンドウ指標は次のように取得します。

Kotlin

val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()

Java

WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();

現在のシステム構成の最大ウィンドウ指標は次のように取得します。

Kotlin

val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()

Java

WindowMetrics maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics();

最大ウィンドウ指標は、計算、レイアウトの選択、事前に取得するリソースのサイズの決定に役立ちます。これを onCreate() で利用できるようにすると、最初のレイアウトパスの前にこれらの決定を行うことができます。これらの指標は、特定のビュー要素のレイアウトには使用しないでください。 代わりに Configuration オブジェクトの情報を使用してください。

ディスプレイ カットアウト

折りたたみ式デバイスでは、折りたたんだときや広げたときにカットアウト ジオメトリが変更されることがあります。カットアウトの問題を回避するには、ディスプレイ カットアウトをサポートするをご覧ください。

セカンダリ ディスプレイ

使用可能なディスプレイは、DisplayManager システム サービスから取得できます。

Kotlin

val displayManager =
getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays =
displayManager.getDisplays()

Java

DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
Display[] displays = displayManager.getDisplays();

Display クラスを使用して、特定のディスプレイに関する情報を取得します。 ディスプレイ サイズ、またはディスプレイが安全かどうかを示すフラグとして渡されます。 ただし、ディスプレイ サイズが以前と同じになるとは限りません。 割り当てられています。マルチウィンドウモードでは アプリがディスプレイの一部を占有します

アクティビティをディスプレイ上で起動できるかどうかは、次のようにして判断します。

Kotlin

val activityManager =
getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val
activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context,
displayId, intent)

Java

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
boolean activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent);

その後、次のようにしてディスプレイ上でアクティビティを起動します。

Kotlin

val options = ActivityOptions.makeBasic()
options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent,
options.toBundle())

Java

ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchDisplayId(targetDisplay.displayId);
startActivity(intent, options.toBundle());

マルチディスプレイのサポート

Android は、ソフトウェア キーボード、壁紙、ランチャーをマルチディスプレイでサポートしています。

ソフトウェア キーボード

ディスプレイがシステム デコレーションをサポートするように設定されている場合は、キーボードをセカンダリ画面上に表示できます。そのディスプレイでテキスト フィールドへの入力をリクエストすると、インプット メソッド エディタが自動的に表示されます。

図 4. セカンダリ ディスプレイのキーボード。

壁紙

Android 10(API レベル 29)では、セカンダリ画面に壁紙を設定できます。「 フレームワークは、インスタンスごとに WallpaperService.Engine のインスタンスを 表示されます。各エンジンのサーフェスが個別に描画されるようにします。デベロッパー のディスプレイ コンテキストを使用してアセットを読み込むことができます。 WallpaperService.Engine#getDisplayContext().また、 WallpaperInfo.xml ファイルセット android:supportsMultipleDisplays="true"

図 5. スマートフォンとセカンダリ ディスプレイに表示された壁紙。

ランチャー

新しいインテント フィルタ カテゴリ SECONDARY_HOME は、セカンダリ画面専用のアクティビティを提供します。このアクティビティのインスタンスは、システム デコレーションをサポートするすべてのディスプレイで使用されます(ディスプレイごとに 1 つ)。

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

アクティビティには、複数のインスタンスの作成を妨げず、さまざまな画面サイズに適応可能な起動モードを設定する必要があります。起動モードを singleInstance または singleTask に設定することはできません。

たとえば、Launcher3 の AOSP 実装は、 SECONDARY_HOME アクティビティ。

図 6. スマートフォンのマテリアル デザイン ランチャー
<ph type="x-smartling-placeholder">
</ph>
図 7.セカンダリ ディスプレイのマテリアル デザイン ランチャー

ウィンドウ指標

Android 11(API レベル 30)で、次の WindowManager メソッドが導入されました 次のようにして、マルチウィンドウ モードで実行されるアプリの境界を指定します。

Jetpack WindowManager ライブラリのメソッド computeCurrentWindowMetrics() および computeMaximumWindowMetrics() では同様の機能が提供されています API レベル 14 との下位互換性があります。

現在のディスプレイ以外のディスプレイの指標を取得するには、次の操作を行います。 (コード スニペットのとおり)。

  • ディスプレイ コンテキストを作成する
  • ディスプレイのウィンドウ コンテキストを作成する
  • ウィンドウ コンテキストの WindowManager を取得する
  • アプリで使用できる最大ディスプレイ領域の WindowMetrics を取得する

Kotlin

val windowMetrics =
context.createDisplayContext(display)
.createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
.getSystemService(WindowManager::class.java) .maximumWindowMetrics

Java

WindowMetrics windowMetrics = context.createDisplayContext(display)
                            .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
                            .getSystemService(WindowManager.class)
                            .getMaximumWindowMetrics();

サポート終了のメソッド

Display メソッドの getSize()getMetrics() のサポートが終了しました API レベル 30 では、新しい WindowManager メソッドの使用が推奨されています。

Android 12(API レベル 31)では、Display メソッドの getRealSize()getRealMetrics() の行動を更新し、 getMaximumWindowMetrics() の動作。

マルチウィンドウ モードの設定

Android 7.0(API レベル 24)以降をターゲットとしているアプリの場合、 アプリのアクティビティがマルチウィンドウ モードをサポートしているかどうかがわかります。広告の 属性を使用して、サイズとレイアウトの両方を制御します。ルート アクティビティの 属性の設定は、そのタスクスタック内のすべてのアクティビティに適用されます。たとえば ルート アクティビティに android:resizeableActivity="true" がある場合は、すべて タスクスタック内のアクティビティはサイズ変更可能です。次のような大きなデバイスでは Chromebook では、アプリの設定が変更可能なウィンドウでも android:resizeableActivity="false"。これによってアプリが動作しなくなった場合は、 Google Play でフィルタして、そのようなデバイスでのアプリの利用を制限します。

Android 12(API レベル 31)では、デフォルトでマルチ ウィンドウ モードになっています。大画面の場合 (または拡大ウィンドウ サイズクラス)、すべてのアプリはマルチウィンドウで実行されます モードを選択できます。小さい画面の場合、システムは アクティビティの minWidthminHeightresizeableActivity 設定を使用して、アクティビティをマルチウィンドウ モードで実行できるかどうかを決定します。

resizeableActivity

この属性は、マニフェストの <activity> または <application> で設定します。 要素を使用して、API レベル 30 以前のマルチウィンドウ モードを有効または無効にすることができます。

<application
  android:name=".MyActivity"
  android:resizeableActivity=["true" | "false"] />;

この属性を true に設定すると、アクティビティを分割画面で起動できます。 自由形式モードがありますこの属性が false に設定されている場合、アクティビティは マルチウィンドウモードをサポートします値が false で、ユーザーが呼び出しを試行し、 マルチウィンドウ モードでアクティビティを起動した場合、アクティビティは 表示されます。

API レベル 24 以降をターゲットとしているアプリで、 属性の値はデフォルトで true になります。

API レベル 31 以降をターゲットとしているアプリの場合、 小さな画面と大きな画面:

  • 大画面または拡大のウィンドウ サイズクラス): すべてのアプリ マルチウィンドウモードをサポートしますこの属性は、アクティビティが サイズ変更されます。resizeableActivity="false" の場合、アプリは 互換モードです。
  • 小画面コンパクト ウィンドウ サイズクラス): resizeableActivity="true" と、アクティビティの最小幅と最小高さ マルチウィンドウの要件の範囲内である場合、アクティビティはマルチウィンドウをサポートしている モード。resizeableActivity="false" の場合、アクティビティはサポートしていません。 アクティビティの最小幅と高さに関係なく、マルチ ウィンドウ モードを選択できます。

supportsPictureInPicture

マニフェストの <activity> ノードでこの属性を設定して、 アクティビティがピクチャー イン ピクチャー モードをサポートしている。

<activity
  android:name=".MyActivity"
  android:supportsPictureInPicture=["true" | "false"] />

configChanges

ユーザーが ウィンドウのサイズを変更する場合は、アプリに android:configChanges 属性を追加します。 マニフェスト <activity> ノードは、少なくとも次の値を持つ必要があります。

<activity
  android:name=".MyActivity"
  android:configChanges="screenSize | smallestScreenSize
      | screenLayout | orientation" />

android:configChanges を追加すると、アクティビティとフラグメントは 破棄するのではなく、onConfigurationChanged() にコールバックを行い、 再作成されます。その後、ビューを手動で更新し、リソースを再読み込みして、 必要に応じて他のオペレーションを実行できます。

<layout>

Android 7.0(API レベル 24)以降では、<layout> マニフェスト要素 マルチウィンドウでのアクティビティの動作に影響する複数の属性をサポート mode:

  • android:defaultHeightandroid:defaultWidth: デフォルトの高さと幅 自由形式モードで起動されたときの アクティビティを指定できます

  • android:gravity: 起動時のアクティビティの初期配置 自由形式モードです適切な値については、Gravity クラスをご覧ください。

  • android:minHeightandroid:minWidth: 最小の高さと最小幅 分割画面モードと自由形式モードの両方でユーザーが移動した場合 分割画面モードの分割線を使用して、アクティビティを ユーザーのサイズに合わせてアクティビティを切り抜く できます。

次のコードは、アクティビティがフリーフォーム モードで表示されるときに、アクティビティのデフォルトのサイズと位置、および最小サイズを指定する方法を示しています。

<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end|..."
          android:minHeight="450dp"
          android:minWidth="300dp" />
</activity>

ランタイムのマルチウィンドウ モード

Android 7.0 以降、システムが提供する機能によって、 マルチウィンドウ モードで実行できます。

マルチウィンドウ モードで無効になる機能

マルチウィンドウ モードでは、Android は、他のアクティビティまたはアプリとデバイスの画面を共有しているアクティビティに適用されない機能を無効にするか、無視することがあります。

また、一部のシステム UI カスタマイズ オプションが無効になります。たとえば アプリがマルチ ウィンドウ モードで実行されている場合、ステータスバーを非表示にすることはできません( システム UI の表示を制御するをご覧ください)。

android:screenOrientation 属性の変更は無視されます。

マルチウィンドウ モードのクエリとコールバック

Activity クラスには、マルチウィンドウをサポートする次のメソッドが用意されています。 mode:

  • isInMultiWindowMode(): アクティビティが次の状態にあるかどうかを示します。 マルチ ウィンドウ モードにします。

  • isInPictureInPictureMode(): アクティビティが次の状態にあるかどうかを示します。 選択します。

  • onMultiWindowModeChanged(): このメソッドが呼び出されると、 マルチ ウィンドウ モードに切り替わったときに発生します。システムがメソッド アクティビティがマルチウィンドウ モードに入った場合は true、値が false の場合は false アクティビティがマルチウィンドウ モードを終了しているとき。

  • onPictureInPictureModeChanged(): 常にこのメソッドが呼び出されます。 アクティビティがピクチャー イン ピクチャー モードになった、またはピクチャー イン ピクチャー モードから抜けた。システムは アクティビティがピクチャー イン ピクチャーに入ると、メソッドが true の値を返す アクティビティがピクチャー イン ピクチャー モードを終了する場合は false に設定します。

Fragment クラスは、これらのメソッドの多くのバージョンを公開しています。たとえば Fragment.onMultiWindowModeChanged().

ピクチャー イン ピクチャー モード

アクティビティをピクチャー イン ピクチャー モードにするには、次の呼び出しを呼び出します。 enterPictureInPictureMode() デバイスで次の条件が満たされている場合、このメソッドは効力がありません。 ピクチャー イン ピクチャー モードには対応していません。詳しくは、次を使用して動画を追加する: ピクチャー イン ピクチャー(PIP)

マルチウィンドウ モードの新しいアクティビティ

新しいアクティビティを起動するときに、新しいアクティビティを (できれば現在の位置の横に表示される)インテント フラグを使用する FLAG_ACTIVITY_LAUNCH_ADJACENT: 新しい ID の作成を試行するようシステムに指示します。 隣接するウィンドウで新しいアクティビティを表示できるため、この 2 つのアクティビティで画面を共有できます。「 システムにより最善を尽くしますが、必ず行われるとは限りません。

デバイスがフリーフォーム モードのときに新しいアクティビティを起動する場合、 新しいアクティビティのディメンションとスクリーンの位置を指定します。 ActivityOptions.setLaunchBounds().このメソッドは、デバイスがユーザーの マルチウィンドウ モードではありません。

API レベル 30 以前では、タスクスタック内でアクティビティを起動すると、 アクティビティが画面上のアクティビティを置き換え、そのマルチウィンドウがすべて継承される プロパティです。新しいアクティビティを Google Cloud の別のウィンドウとして 新しいタスクスタックで起動する必要があります。

Android 12(API レベル 31)では、アプリはタスク ウィンドウを複数のアクティビティに分配できます。アプリが特定のリソースをどのように表示するかは、 XML を作成して、アクティビティ(全画面表示、横並び、積み重ね)を設定 または Jetpack WindowManager API 呼び出しを実行します。

ドラッグ&ドロップ

2 つのアクティビティが画面を共有しているとき、ユーザーは一方のアクティビティからもう一方のアクティビティにデータをドラッグ&ドロップできます(Android 7.0 より前のバージョンでは、 1 つのアクティビティ内でデータをドロップします)。承認のサポートを迅速に追加するには DropHelper API を参照。ドラッグ&ドロップで ドラッグ&ドロップを有効にするをご覧ください。

マルチインスタンス

各ルート アクティビティは独自のタスクを持ち、独立したプロセスで実行され、独自のウィンドウに表示されます。別のインスタンスでアプリの新しいインスタンスを起動するには、 FLAG_ACTIVITY_NEW_TASK フラグを使用して新しいアクティビティを開始できます。マイページ いくつかのマルチウィンドウ属性と組み合わせて 新しいウィンドウ用の特定の場所を選択しますたとえば、ショッピング アプリであれば、商品比較のために複数のウィンドウを表示できます。

Android 12(API レベル 31)では、アクティビティの 2 つのインスタンスを起動できます。 横に並べて表示できます。

ユーザーがアプリケーションの別のインスタンスを ランチャーまたはタスクバーを開くと、ランチャー アクティビティが android:resizeableActivity="true" を設定し、起動モードを 防ぐことができます。たとえば、singleInstancePerTask アクティビティは、 異なるタスクで複数回インスタンス化される FLAG_ACTIVITY_MULTIPLE_TASK または FLAG_ACTIVITY_NEW_DOCUMENT が設定されている。

マルチインスタンスと、リストと詳細などのマルチパネル レイアウトを混同しないでください。 プレゼンテーションです。これは、単一の API 内で実行される SlidingPaneLayout を使用します。 クリックします。

なお、折りたたみ式デバイスで複数のインスタンスが個別のウィンドウで実行されている場合、形状が変更されると、1 つ以上のインスタンスがバックグラウンドに移動されることがあります。たとえば、デバイスが折りたたまれていない状態で、2 つのアプリ インスタンスが折り目の両側にある 2 つのウィンドウで実行されているとします。デバイスが折りたたまれると、小さくなった画面に合うよう両方のインスタンスが調整される代わりに、片方のインスタンスが終了する可能性があります。

マルチウィンドウ モードの確認

アプリが API レベル 24 以降をターゲットとしているかどうかにかかわらず、 ユーザーがマルチウィンドウで起動しようとした場合、マルチウィンドウ モードで動作 Android 7.0 以降を搭載したデバイスでご利用いただけます。

デバイスをテストする

Android 7.0(API レベル 24)以降を搭載したデバイスは、マルチ ウィンドウ モードをサポートしています。

API レベル 23 以下

アプリが固定された画面の向きを宣言していない限り、ユーザーがマルチ ウィンドウ モードでアプリを使用しようとすると、システムはアプリのサイズを強制的に変更します。

アプリが画面の向きの固定を宣言していない場合は、 Android 7.0 以降を搭載しているデバイスで、アプリを 分割画面モードにできますアプリが動作し、 サイズ変更されます。

アプリが固定された画面の向きを宣言している場合は、アプリをマルチウィンドウ モードにしてみる必要があります。マルチ ウィンドウ モードにしても、全画面モードのままであることを確認します。

API レベル 24~30

アプリが API レベル 24~30 をターゲットにしており、マルチウィンドウのサポートを無効にしていない場合は、分割画面モードとフリーフォーム モードの両方で次の動作を確認します。

  • アプリを全画面表示にしてからマルチウィンドウ モードに切り替える [履歴] ボタンを長押しします。アプリが適切に切り替わることを確認します。

  • マルチ ウィンドウ モードでアプリを直接起動し、アプリが動作していることを確認する 確認します。ボタンを押すと、アプリをマルチ ウィンドウ モードで起動できます。 [最近] ボタンをタップしてから、アプリのタイトルバーを長押しして、 画面上のハイライト表示された領域のいずれかにドロップします。

  • 画面の分割線をドラッグして、分割画面モードでアプリのサイズを変更します。確認 アプリがクラッシュせずにサイズ変更され、必要な UI 要素が 表示されます。

  • アプリの最小サイズを指定している場合は、 そのサイズよりも小さくすることができます。以下を確認します。 アプリのサイズを、指定した最小値よりも小さくすることはできません 定義できます。

  • すべてのテストを通して、アプリのパフォーマンスが許容範囲内かどうかを確認します。対象 たとえば、API 呼び出しの後に UI を更新するためのラグが サイズ変更されます。

API レベル 31 以降

アプリが API レベル 31 以降をターゲットとしていて、メイン アクティビティの最小幅をターゲットとしている場合 最小の高さは、各要素の寸法以下である必要があります。 API レベル 24 でリストされている動作をすべて検証します。 30 ~ 30 日

テスト チェックリスト

マルチウィンドウ モードでアプリのパフォーマンスを確認するには、以下の操作を試します。特に記載のない限り、分割画面モードとフリーフォーム モードの両方で試す必要があります。

  • マルチウィンドウ モードを開始して終了します。

  • アプリから別のアプリに切り替えて、アプリが動作することを確認する 適切に表示され続けますたとえば、アプリが ユーザーが操作している間に動画が再生され続けることを 別のアプリの操作。

  • 分割画面モードで、画面の分割線を動かしてアプリを両方表示してみましょう 大きくします。これらのオペレーションを左右と上の両方で試す 適用できます。アプリがクラッシュしていないことを確認する(必須) 機能が表示され、サイズ変更操作に時間がかかりすぎることはありません。

  • いくつかのサイズ変更操作を続けてすばやく行います。アプリが クラッシュやメモリリークが発生しませんAndroid Studio の Memory Profiler は、 アプリのメモリ使用量に関する情報を確認できます(アプリのメモリを検査する Memory Profiler の使用法をご覧ください)。

  • さまざまなウィンドウ構成でアプリを正常に使用する アプリが正しく動作するか検証します。テキストが判読可能であることを確認し、 UI 要素が操作するには小さすぎない。

マルチウィンドウのサポートを無効にする場合

API レベル 24 ~ 30 で、 android:resizeableActivity="false" 様、アプリをデバイスで起動してください Android 7.0 ~ 11 でアプリを分割画面に切り替えてみる 自由形式モードですその際、アプリが全画面表示のままであることを確認する モード。

参考情報

Android でのマルチウィンドウのサポートについて詳しくは、以下をご覧ください。

あなたへのおすすめ * 注: JavaScript がオフになっている場合はリンクテキストが表示されます * デバイス互換モード * 大画面のサイズ変更をサポートする * 構成の変更を処理する