Android N のマルチウィンドウ: それを最大限に活用するために開発者が知っておくべきこと

Android N での今後のマルチウィンドウ サポートが開発者にとって何を意味するのか、そしてそれを最大限に活用する方法について概要を説明します。

マルチウィンドウのサポートは、Android N に期待されている優れた機能です。 私たちが長い間すべてのデバイスで利用できるようにしたいと考えていました. ただし、楽しいエクスペリエンスにするためには、開発者がそれを正しくサポートするためにアプリにいくつかの変更を加える必要がある場合があります。

Google I/O セッションの 1 つは、開発者が新しい API とマルチウィンドウ サポートによってもたらされるシステム動作の変化について学ぶためのものでした。

このセッションは、Android ActivityManager のテクニカル リード マネージャーである Wale Ogunwale によって発表されました。 WindowManager フレームワーク コンポーネント -- 彼と彼のチームは、Android 上のマルチウィンドウを担当しています。

視聴できます YouTube でのマルチウィンドウ モード セッションですが、ここでもセッションの概要を紹介します。

N では、3 つの異なるマルチウィンドウ モードが導入されています。
  • 画面分割モード: これはデフォルトで利用可能なモードです。 名前が示すように、2 つのアプリケーションを並べて開くことができます。
  • フリーフォーム モード: メーカーはこれを大型デバイスで有効にすることができ、ユーザーは分割画面モードに加えてアクティビティのサイズを自由に変更できます。
  • ピクチャーインピクチャーモード: Android TV デバイスを対象としたこのモードは、ユーザーが他のアプリケーションを操作している間にビデオ プレーヤーが固定ウィンドウで実行されることを目的としています。
Android N 分割画面モードAndroid N PiP モード
それは注目に値します。 以前に N のマルチウィンドウについて取り上げ、現在のシステムについていくつかの批判を提供しました。. それを念頭に置いて、フリーフォーム モードがピクチャ イン ピクチャ モードに少しでも近づくことを期待しています。そうすれば、すべてのデバイスで便利なアプリケーションが得られるでしょう。
アプリでマルチ ウィンドウ サポートを有効にするのは簡単です。すでに N をターゲットにしている場合は何もする必要はありません。マルチ ウィンドウを無効にする場合は、 を設定することで無効にすることができます。
android: resizeableActivity マニフェスト内の activity 属性を次のように変更します。 false. これは本当に正当な場合にのみ実行してください。常にアプリが悪目立ちしてしまうためです。 ユーザー (または別のアプリ) がマルチウィンドウで起動しようとしても、全画面モードで起動します モード。 ルート アクティビティの属性は、そのタスク スタック内のすべてのアクティビティに適用されることに注意することが重要です。 言い換えれば、他のアプリによって開始できるアクティビティがある場合は、それがマルチウィンドウ モードをサポートしていることを確認してください。 他のアプリが を使用して新しいタスクでアクティビティを起動することは保証できないためです。 Intent#FLAG_ACTIVITY_NEW_TASK .ピクチャー・イン・ピクチャー・モードのサポートは、を介して明示的に宣言する必要があります。 android: supportsPictureInPicture 属性。 次の場合、この属性は無視されることに注意してください。 android: resizeableActivity は。 false .Layout 属性を使用して、フリーフォーム ウィンドウのデフォルトの寸法と配置を設定したり、フリーフォーム モードと分割画面モードの両方で最小の幅または高さを指定したりできます。
  • android: defaultWidth/android: defaultHeight: アクティビティのデフォルトの寸法 (フリーフォーム モード)。
  • android: gravity: アクティビティの初期位置 (フリーフォーム モード)。
  • android: minimalWidth/android: minimalHeight: アクティビティの最小サイズ (フリーフォーム モードと分割画面モード)
コード例は次のとおりです。 Google のマルチウィンドウ プレイグラウンド サンプル アプリ GitHub 上: AndroidManifest.xml.
マルチウィンドウ サポートの導入により、アプリが正しく動作することを確認するために、アプリ内のいくつかの点を再確認する必要がある場合があります。

アクティビティのライフサイクルを理解する

アクティビティのライフサイクル マルチウィンドウ モードでは変更されません。 Android アクティビティの基本的なライフサイクル そうは言っても、アクティビティ状態間の微妙な違いにより、N を実行する前には通常気付かなかった意図しない動作が発生する可能性があります。 それを知ることが重要です。 Activity#onResume() そして。 Activity#onPause() は、アプリがフォーカスを取得または失ったときに呼び出されますが、必ずしも表示を開始または停止したときに呼び出されるとは限りません。 (常に 1 つのアプリだけがフォーカスを持つことができることに注意してください。)コンテンツを継続的に更新するアプリ (ビデオ再生など) の場合は、コンテンツ更新の開始と停止を で処理するようにしてください。 Activity#onStart() そして。 Activity#onStop() その代わり。 たとえば、ビデオ アプリではそうしません。 アプリがフォーカスされている場合にのみ再生が行われることを意味します、これはマルチウィンドウ モードの目的を無効にします。 Android N Developer Preview が最初にリリースされたとき、公式 YouTube アプリにも同様の問題がありました。.

実行時の変更の処理

アプリがマルチウィンドウ モードになると、一部のデバイス構成が変更されます。 アクティビティの再開を許可することもできます (この場合。 フラグメントの保持 アクティビティが起動時に集中的な操作を実行する必要がある場合は、これは良いアイデアかもしれません)、またはそうすることを選択します。 構成変更を明示的に処理する その代わり。 マルチウィンドウ モードに入るとき、またはマルチウィンドウ モード内で、次の 4 つのデバイス構成が変更される可能性があります。 screenSize, smallestScreenSize, screenLayout そして。 orientation. を参照してください。 Android 開発者向けドキュメント 各属性の詳細については、こちらを参照してください。ただし、注意してください。 orientation この場合、デバイスの向きを指すことはなくなりました。 代わりに、アクティビティの幅が高さ (横長) よりも大きいかどうかを示すだけです。 アクティビティがこれらの変更を処理することをマニフェストから宣言できます。
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
これは、これらの変更を実際に処理する必要があることを意味することに注意してください。 Activity#onConfigurationChanged()手動でビューを更新するか、一部のリソースを再読み込みします。

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

一部のシステム機能は、マルチウィンドウ モード中のアクティビティの影響を受けません。
  • システム バーを暗くしたり非表示にしたり、イマーシブ モードを使用したりするなど、ステータス バーとナビゲーション バーの変更は効果がありません。 アクティビティは画面の一部のみを占めるため、これは当然のことです。
  • android: screenOrientation activity 属性もマルチウィンドウ モードでは効果がありません。アクティビティはサイズ変更可能になるため、方向が固定されていても意味がありません。
マルチウィンドウ イベント用の新しいコールバックと、現在の状態をクエリするメソッドが追加されました。
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): アクティビティの状態がフルスクリーンからマルチウィンドウに、またはその逆に変化したときに呼び出されます。
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): アクティビティ状態が PIP モードに切り替わるとき、または PIP モードから切り替わるときに呼び出されます。
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): アクティビティがマルチウィンドウ/ピクチャーインピクチャーモードであるかどうかを返します。
  • Activity#overlayWithDecorCaption(boolean overlay): フリーフォーム ウィンドウの場合、このメソッドを使用して、キャプション (ウィンドウをドラッグするために使用されるバー) をコンテンツを押し下げるのではなくオーバーレイさせることができます。
PS. を除いて。 Activity#overlayWithDecorCaption()、これらのメソッドは によっても提供されています。 Fragment クラス。

マルチウィンドウ モードでアクティビティを開始する

  • Activity#enterPictureInPictureMode() アクティビティをピクチャ イン ピクチャ モードにするために使用できます。 PiP モードのアクティビティは入力イベントに関する通知を受け取らないことに注意してください。 MediaSession#setMediaButtonReceiver() そのようなイベントを処理したい場合。 興味がある場合は、Android Developers Web サイトも必ずチェックしてください。 Android N のピクチャー・イン・ピクチャー.
  • デバイスが分割画面モードの場合は、 Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT フラグ。 分割画面モードでない場合、このフラグは効果がありません。
  • デバイスがフリーフォーム モードの場合、 ActivityOptions#setLaunchBounds() 新しいアクティビティの寸法と画面上の位置を指定するために使用できます。
コード例については、マルチウィンドウ プレイグラウンド サンプル アプリを確認してください。 隣接するアクティビティの例, 起動境界の例.

ドラッグアンドドロップ

ドラッグ アンド ドロップのサポートは Honeycomb 以来存在していましたが、以前は同じアクティビティ内でのみ可能でした。 雪が降る。 マルチウィンドウでサポートされています 同じように。 これを実装するそうです。 ほとんど前と同じ、クロスアクティビティのドラッグ アンド ドロップ用にいくつかの追加が加えられています。
  • View#startDragAndDrop()
    • の新しいエイリアス View#startDrag().
    • クロスアクティビティのドラッグ アンド ドロップを有効にするには、新しいフラグを渡します View#DRAG_FLAG_GLOBAL.
    • 受信者のアクティビティに URI アクセス許可を与える必要がある場合は、新しいフラグを渡します View#DRAG_FLAG_GLOBAL_URI_READ または View#DRAG_FLAG_GLOBAL_URI_WRITE、 適切に。
  • View#updateDragShadow()
    • 現在進行中のドラッグ操作のドラッグ シャドウを置き換えます。 ドラッグ操作を開始したアプリによってのみ呼び出すことができます。
  • View#cancelDragAndDrop()
    • 現在進行中のドラッグ操作をキャンセルします。 ドラッグ操作を開始したアプリによってのみ呼び出すことができます。
  • デバイスがフリーフォーム モードまたはピクチャ イン ピクチャ モードをサポートしているかどうかを確認するには、 PackageManager#hasSystemFeature()を使用して PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT そして PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE それぞれ。
  • android: windowBackground アクティビティのサイズが変更され、そのレンダリングが遅れている場合は、属性を背景のドローアブルとして使用できます。 もし android: windowBackground 設定されていない、 android: windowBackgroundFallback 代わりに使用されます。 例については、マルチウィンドウ プレイグラウンド サンプル アプリを参照してください。.
Wale 氏は、ユーザーに可能な限り最高のエクスペリエンスを提供するためのいくつかのベスト プラクティスを提供しました。
  • モードの変更をエレガントに処理します。
    • 向きに関係なく UI の一貫性を維持する. スムーズな遷移を可能にするために、要素の位置を変更しないでください。
    • 上記を拡張すると、 携帯電話/タブレットのレイアウトで非常に異なるレイアウトを切り替えないでください。. 代わりに、一貫性を保つために、タブレットのレイアウトを小さいサイズに合わせて調整します。
  • アクティビティが小さなサイズに適応していることを確認してください による マテリアル デザイン パターンに従って.
  • 使用 FLAG_ACTIVITY_LAUNCH_ADJACENT 分割画面モードでより楽しいエクスペリエンスを実現することが合理的である場合。
  • 正当な場合にのみサイズ変更の非互換性を宣言する. 上で説明したように、そうしないとアプリが悪目立ちしてしまいます。
Wale 氏は追加の有用なリソースをいくつか提供してセッションを終了しました。
  • マルチウィンドウのドキュメント.
  • 分割画面モードのマテリアル デザイン ガイドライン.
  • マルチウィンドウ アプリのサンプル.