blob: dba58be007996585c51a5da5769959ccc67217dd [file] [log] [blame]
page.title=マルチ ウィンドウのサポート
page.metaDescription=複数のアプリを同時に表示するための Android N の新しいサポート。
page.keywords="multi-window", "android N", "split screen", "free-form"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>このドキュメントの内容</h2>
<ol>
<li><a href="#overview">概要</a></li>
<li><a href="#lifecycle">マルチ ウィンドウ ライフサイクル</a></li>
<li><a href="#configuring">マルチ ウィンドウ モード向けアプリを構成する</a>
</li>
<li><a href="#running">マルチ ウィンドウ モードでアプリを実行する</a></li>
<li><a href="#testing">アプリのマルチ ウィンドウ サポートをテストする</a></li>
</ol>
<h2>関連ドキュメント</h2>
<ol>
<li><a class="external-link" href="https://github.com/googlesamples/android-MultiWindowPlayground">マルチ ウィンドウ Playground のサンプルアプリ</a>
</li>
<li><a class="external-link" href="https://medium.com/google-developers/5-tips-for-preparing-for-multi-window-in-android-n-7bed803dda64">Android N でマルチ ウィンドウを準備するための 5 つのヒント</a></li>
</ol>
</div>
</div>
<p>
Android N には、複数のアプリを同時に表示するためのサポートが追加されています。
ハンドヘルド端末で、分割画面モードにして、2 つのアプリを並べて実行したり、重ねて表示したりできます。<em></em>
TV 端末で、アプリがピクチャ イン ピクチャ モードで動画を再生しているときに、ユーザーは別のアプリを操作できます。<em></em>
</p>
<p>
N Preview SDK でアプリをビルドする場合、アプリがマルチ ウィンドウ ディスプレイを処理をする方法を設定できます。
たとえば、アクティビティの最小許容ディメンションを指定できます。
また、アプリに対してマルチ ウィンドウ ディスプレイを無効にし、アプリを全画面モードのみで表示することもできます。
</p>
<h2 id="overview">概要</h2>
<p>
Android N では、複数のアプリが画面を同時に共有できます。たとえば、ユーザーは画面を分割し、ウェブページを左側の画面に表示しながら、右側の画面でメールを作成することができます。
ユーザー エクスペリエンスは端末によって異なります。
</p>
<ul>
<li>Android N を実行しているハンドヘルド端末は、分割画面モードに対応しています。
このモードでは、画面で 2 つのアプリが実行され、これらのアプリを並べて、または重ねて表示できます。
ユーザーは、2 つのアプリを分離している分割線をドラッグして、1 つのアプリを拡大し、もう 1 つのアプリを縮小することができます。
</li>
<li>Android N を実行している Nexus Player で、アプリを<a href="picture-in-picture.html">ピクチャ イン ピクチャ モード</a>にすると、アプリにコンテンツを表示したまま、ユーザーは他のアプリをブラウジングまたは操作することができます。
</li>
<li>より大きい画面の端末のメーカーは、ユーザーが各アクティビティのサイズを自由に変更できるフリーフォーム モードを有効にすることもできます。
メーカーがこの機能を有効にした場合、端末では、分割画面モードに加えて、フリーフォーム モードが利用できます。
</li>
</ul>
<img src="{@docRoot}preview/images/mw-splitscreen.png" alt="" width="650" srcset="{@docRoot}preview/images/mw-splitscreen.png 1x,
{@docRoot}preview/images/mw-splitscreen_2x.png 2x," id="img-split-screen" />
<p class="img-caption">
<strong> 1.</strong> 分割画面モードで並べて実行されている 2 つのアプリ。
</p>
<p>
ユーザーは、次の方法でマルチ ウィンドウ モードに切り替えることができます。
</p>
<ul>
<li>ユーザーは <a href="{@docRoot}guide/components/recents.html">[Overview] 画面</a>を開いているときに、アクティビティのタイトルを長押ししてから、そのアクティビティを画面の強調表示された部分にドラッグすることにより、アクティビティをマルチ ウィンドウ モードにすることができます。
</li>
<li>ユーザーが [Overview] ボタンを長押しすると、現在のアクティビティがマルチ ウィンドウ モードになり、[Overview] 画面が開くので、ユーザーは、画面で共有する別のアクティビティを選択できるようになります。
</li>
</ul>
<p>
ユーザーは、複数のアクティビティが画面を共有しているときに、データを 1 つのアクティビティから別のアクティビティに<a href="{@docRoot}guide/topics/ui/drag-drop.html">ドラッグ&ドロップ</a>できます
(以前は、単一のアクティビティ内でのみデータをドラッグ&ドロップできました)。
</p>
<h2 id="lifecycle">マルチ ウィンドウ ライフサイクル</h2>
<p>
マルチ ウィンドウ モードは、<a href="{@docRoot}training/basics/activity-lifecycle/index.html">アクティビティのライフサイクル</a>を変更しません。
</p>
<p>
マルチ ウィンドウ モードでは、ユーザーが直前に操作したアクティビティのみが任意の時点でアクティブになります。
このアクティビティは、トップ レベルにあると見なされます。<em></em>
他のすべてのアクティビティは、表示されていても一時停止状態になっています。
ただし、一時停止状態ではあるが、表示されているこれらのアクティビティには、表示されていないアクティビティよりも高い優先度が付与されます。
ユーザーが一時停止状態のアクティビティのいずれかを操作した場合、そのアクティビティが再開され、前のトップ レベルのアクティビティが一時停止します。
</p>
<p class="note">
<strong>注:</strong>マルチ ウィンドウ モードでは、アプリが一時停止状態になっても、そのアプリを表示したままにすることができます。
アプリは、一時停止していても、アクティビティを続行する必用がある場合があります。
たとえば、一時停止モードになっているが、表示されている動画再生アプリは、動画の表示を継続する必要があります。
そのため、動画を再生するアクティビティが {@link android.app.Activity#onPause onPause()} ハンドラで動画を一時停止しないようにすることをお勧めします。
<em></em>
その代わり、これらのアクティビティは {@link android.app.Activity#onStop
onStop()} で動画を一時停止し、{@link android.app.Activity#onStart
onStart()} で動画の再生を再開する必要があります。
</p>
<p>
<a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更の処理</a>で指定したように、ユーザーがアプリをマルチ ウィンドウ モードにすると、アクティビティに構成の変更が通知されます。
これは、ユーザーがアプリのサイズを変更するか、アプリを全画面モードに戻した場合にも行われます。
基本的に、この構成の変更は、端末が縦表示から横表示に切り替えられたことをアプリに通知する場合と同じ影響(端末のディメンションが変更された場合を除いて)をアクティビティのライフサイクルに及ぼします。
<a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更の処理</a>で説明したように、アクティビティは構成の変更を処理することができます。または、システムによってアクティビティを破棄し、新しいディメンションでアクティビティを再作成することもできます。
</p>
<p>
ユーザーがウィンドウのサイズを変更して、高さや幅を拡大した場合、ユーザー操作に一致するようにアクティビティのサイズが変更され、必要に応じて、<a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更</a>が発行されます。
アプリで新しく表示された領域を描画するまでに時間がかかる場合、{@link
android.R.attr#windowBackground windowBackground} 属性またはデフォルトの
<code>windowBackgroundFallback</code> システム属性によって指定された色でこれらの領域が一時的に塗りつぶされます。
</p>
<h2 id="configuring">マルチ ウィンドウ モード向けアプリを構成する</h2>
<p>
アプリが Android N をターゲットにしている場合は、アプリのアクティビティがマルチ ウィンドウ ディスプレイをサポートする方法や、このサポートを行うかどうかを決めることができます。
サイズとレイアウトを制御するための属性をマニフェストに設定できます。
ルート アクティビティ属性の設定は、タスクスタック内のすべてのアクティビティに適用されます。
たとえば、ルート アクティビティにより
<code>android:resizeableActivity</code> true に設定されると、タスク スタック内のすべてのアクティビティのサイズを変更できるようになります。
</p>
<p class="note">
<strong>注:</strong>Android N より前の SDK バージョンでマルチ オリエンテーション アプリをビルドして、そのアプリをマルチ ウィンドウ モードで使用する場合は、アプリのサイズが強制的に変更されます。
アプリに予想外の動作が発生する場合があることをユーザーに警告するダイアログ ボックスが表示されます。
システムは、画面の向きが固定されたアプリのサイズを変更しません。ユーザーがマルチ ウィンドウ モードで画面の向きが固定されたアプリを開こうとすると、そのアプリが全画面で表示されます。<em></em>
</p>
<h4 id="resizeableActivity">android:resizeableActivity</h4>
<p>
マルチ ウィンドウ ディスプレイを有効または無効にするには、この属性をマニフェストの <code>&lt;activity&gt;</code> ノードまたは
<code>&lt;application&gt;</code> ノードに設定します。
</p>
<pre>
android:resizeableActivity=["true" | "false"]
</pre>
<p>
この属性が true に設定されている場合、アクティビティを分割画面モードまたはフリーフォーム モードで起動できます。
この属性が false に設定されている場合、アクティビティはマルチ ウィンドウ モードをサポートしません。
この値が false のとき、ユーザーがアクティビティをマルチ ウィンドウ モードで起動しようとすると、アクティビティが全画面で表示されます。
</p>
<p>
アプリが Android N をターゲットにしているが、この属性の値が指定されていない場合、属性の値がデフォルトの true になります。
</p>
<h4 id="supportsPictureInPicture">android:supportsPictureInPicture</h4>
<p>
この属性をマニフェストの <code>&lt;activity&gt;</code> ノードに設定すると、アクティビティがピクチャ イン ピクチャ ディスプレイをサポートするかどうかを示すことができます。
<code>android:resizeableActivity</code> false の場合、この属性は無視されます。
</p>
<pre>
android:supportsPictureInPicture=["true" | "false"]
</pre>
<h3 id="layout">レイアウト属性</h3>
<p>
Android N では、<code>&lt;layout&gt;</code> マニフェスト要素により、マルチ ウィンドウ モードでのアクティビティの動作に影響を及ぼすいくつかの属性がサポートされています。
</p>
<dl>
<dt>
<code>android:defaultWidth</code>
</dt>
<dd>
フリーフォーム モードで起動されたときのアクティビティのデフォルトの幅です。
</dd>
<dt>
<code>android:defaultHeight</code>
</dt>
<dd>
フリーフォーム モードで起動されたときのアクティビティのデフォルトの高さです。
</dd>
<dt>
<code>android:gravity</code>
</dt>
<dd>
フリーフォーム モードで起動されたときのアクティビティの初期配置です。適切な値については、
{@link android.view.Gravity} のリファレンスをご覧ください。
</dd>
<dt>
<code>android:minimalHeight</code>、<code>android:minimalWidth</code>
</dt>
<dd>
分割画面モードおよびフリーフォーム モードでのアクティビティの最小の高さと幅です。
ユーザーが分割画面モードの分割線を移動して、アクティビティを指定された最小ディメンションよりも小さくすると、アクティビティはユーザーがリクエストしたサイズにトリミングされます。
</dd>
</dl>
<p>
たとえば、次のコードは、アクティビティがフリーフォーム モードで表示されているときに、アクティビティのデフォルトのサイズと位置、およびその最小サイズを指定する方法を示しています。
</p>
<pre>
&lt;activity android:name=".MyActivity"&gt;
&lt;layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minimalHeight="450dp"
android:minimalWidth="300dp" /&gt;
&lt;/activity&gt;
</pre>
<h2 id="running">マルチ ウィンドウ モードでアプリを実行する</h2>
<p>
Android N では、マルチ ウィンドウ モードで実行できるアプリをサポートするための新しい機能が導入されています。
</p>
<h3 id="disabled-features">マルチ ウィンドウ モードで無効になる機能</h3>
<p>
端末がマルチ ウィンドウ モードになっている場合、特定の機能は、端末の画面を他のアクティビティやアプリと共有する場合があるアクティビティに対して機能しないため、これらの機能は無効なるか、無視されます。
これらの機能には、次のものが含まれます。
<ul>
<li><a href="{@docRoot}training/system-ui/index.html">システム UI</a> の一部のカスタマイズ オプションは無効になります。たとえば、アプリが全画面モードで実行されていない場合、アプリのステータスバーを非表示にできません。
</li>
<li>システムは、<code><a href=
"{@docRoot}guide/topics/manifest/activity-element.html#screen"
>android:screenOrientation</a></code> 属性に加えられた変更を無視します。
</li>
</ul>
<h3 id="change-notification">マルチ ウィンドウの変更通知とクエリ</h3>
<p>
マルチ ウィンドウ ディスプレイをサポートするために、次の新しいメソッドが {@link android.app.Activity} クラスに追加されています。
各メソッドの詳細については、<a href="{@docRoot}preview/setup-sdk.html#docs-dl">N Preview SDK リファレンス</a>をご覧ください。
</p>
<dl>
<dt>
<code>Activity.isInMultiWindowMode()</code>
</dt>
<dd>
アクティビティがマルチ ウィンドウ モードで実行されているかどうかを判別するために呼び出します。
</dd>
<dt>
<code>Activity.isInPictureInPictureMode()</code>
</dt>
<dd>
アクティビティがピクチャ イン ピクチャ モードで実行されているかどうかを判別するために呼び出します。
<p class="note">
<strong>注:</strong>ピクチャ イン ピクチャ モードは、マルチ ウィンドウ モードの特別な形態です。
<code>myActivity.isInPictureInPictureMode()</code> が true を返す場合は、<code>myActivity.isInMultiWindowMode()</code> true を返します。
</p>
</dd>
<dt>
<code>Activity.onMultiWindowModeChanged()</code>
</dt>
<dd>
アクティビティがマルチ ウィンドウ モードになるか、マルチ ウィンドウ モードではなくなると、常にこのメソッドが呼び出されます。
アクティビティがマルチ ウィンドウ モードになると、このメソッドに true 値が渡され、アクティビティがマルチ ウィンドウ モードではなくなると、このメソッドに false 値が渡されます。
</dd>
<dt>
<code>Activity.onPictureInPictureModeChanged()</code>
</dt>
<dd>
アクティビティがピクチャ イン ピクチャ モードになるか、ピクチャ イン ピクチャ モードではなくなると、常にこのメソッドが呼び出されます。
アクティビティがピクチャ イン ピクチャ モードになると、このメソッドに true 値が渡され、アクティビティがピクチャ イン ピクチャ モードではなくなると、このメソッドに false 値が渡されます。
</dd>
</dl>
<p>
また、これらの各メソッドの {@link android.app.Fragment} バージョンがあります。たとえば、<code>Fragment.isInMultiWindowMode()</code> です。
</p>
<h3 id="entering-pip">ピクチャ イン ピクチャ モードにする</h3>
<p>
アクティビティをピクチャ イン ピクチャ モードにするには、新しいメソッド
<code>Activity.enterPictureInPictureMode()</code> を呼び出します。端末がピクチャ イン ピクチャ モードをサポートしない場合、このメソッドの効果はありません。
詳細については、<a href="picture-in-picture.html">ピクチャ イン ピクチャ</a>に関するドキュメントをご覧ください。
</p>
<h3 id="launch">マルチ ウィンドウ モードで新しいアクティビティを起動する</h3>
<p>
新しいアクティビティを起動するときに、可能であれば、新しいアクティビティを現在のアクティビティの隣に表示する必用があるかどうかをシステムに示すことができます。
そうするには、フラグ
<code>Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT</code> を使用します。
このフラグを渡すと、次の動作がリクエストされます。
</p>
<ul>
<li>端末が分割画面モードになっている場合、システムは、起動しているアクティビティの隣に新しいアクティビティを作成しようとするので、これらの 2 つのアクティビティが画面を共有します。
システムでは、この操作の実行が保証されるわけではありませんが、可能であれば、アクティビティが並べて表示されます。
</li>
<li>端末が分割画面モードではない場合、このフラグの効果はありません。
</li>
</ul>
<p>
端末がフリーフォーム モードになっている場合、新しいアクティビティを起動するときに、
<code>ActivityOptions.setLaunchBounds()</code> を呼び出すことにより、新しいアクティビティのディメンションと画面上での位置を指定することができます。
端末がマルチ ウィンドウ モードではない場合、このメソッドの効果はありません。
</p>
<p class="note">
<strong>注:</strong>タスクスタック内でアクティビティを起動すると、画面上のアクティビティが起動したアクティビティに置き換えられ、すべてのマルチ ウィンドウ プロパティが継承されます。
マルチ ウィンドウ モードで新しいアクティビティを別個の画面として起動する場合は、新しいアクティビティを新しいタスクスタックで起動する必要があります。
</p>
<h3 id="dnd">ドラッグ&ドロップのサポート</h3>
<p>
ユーザーは、2 つのアクティビティが画面を共有しているときに、データを 1 つのアクティビティから別のアクティビティに<a href="{@docRoot}guide/topics/ui/drag-drop.html">ドラッグ&ドロップ</a>できます
(以前は、単一のアクティビティ内でのみデータをドラッグ&ドロップできました)。
そのため、アプリがドラッグ&ドロップをサポートしていない場合は、ドラッグ&ドロップ機能をアプリに追加する必要があります。
</p>
<p>
N Preview SDK では、異なるアプリ間のドラッグ&ドロップをサポートするために、<a href="{@docRoot}reference/android/view/package-summary.html"><code>android.view</code></a> パッケージが拡張されています。
次のクラスとメソッドの詳細については、<a href="{@docRoot}preview/setup-sdk.html#docs-dl">N Preview SDK リファレンス</a>をご覧ください。
</p>
<dl>
<dt>
<code>android.view.DropPermissions</code>
</dt>
<dd>
ドロップを受け取るアプリに付与されるパーミッションの指定を処理するトークン オブジェクトです。
</dd>
<dt>
<code>View.startDragAndDrop()</code>
</dt>
<dd>
{@link android.view.View#startDrag View.startDrag()} の新しいエイリアスです。異なるアクティビティ間のドラッグ&ドロップを有効にするには、新しいフラグ
<code>View.DRAG_FLAG_GLOBAL</code> を渡します。
URI パーミッションを受け取る側のアクティビティに付与する必要がある場合、必要に応じて、新しいフラグ
<code>View.DRAG_FLAG_GLOBAL_URI_READ</code> または
<code>View.DRAG_FLAG_GLOBAL_URI_WRITE</code> を渡します。
</dd>
<dt>
<code>View.cancelDragAndDrop()</code>
</dt>
<dd>
実行中のドラッグ操作をキャンセルします。ドラッグ操作を開始したアプリだけが呼び出せます。
</dd>
<dt>
<code>View.updateDragShadow()</code>
</dt>
<dd>
実行中のドラッグ操作のドラッグ シャドウを置き換えます。ドラッグ操作を開始したアプリだけが呼び出せます。
</dd>
<dt>
<code>Activity.requestDropPermissions()</code>
</dt>
<dd>
{@link android.view.DragEvent} に含まれる {@link
android.content.ClipData} で渡されるコンテンツ URI のパーミッションをリクエストします。
</dd>
</dl>
<h2 id="testing">アプリのマルチ ウィンドウ サポートをテストする</h2>
<p>
ユーザーが Android N を実行している端末をマルチ ウィンドウ モードにしてアプリの起動を試みる場合に備えて、Android N 向けにアプリをアップデートするかどうかに関係なく、アプリがマルチ ウィンドウ モードでどのように動作するかを確認する必要があります。
</p>
<h3 id="configuring">テスト端末の構成</h3>
<p>
Android N を端末にインストールすると、分割画面モードが自動的にサポートされます。
</p>
<h3 id="test-non-n">アプリが N Preview SDK でビルドされていない場合</h3>
<p>
アプリが N Preview SDK でビルドされていないときに、ユーザーがマルチ ウィンドウ モードでそのアプリを使用しようとすると、アプリが画面の向きの固定を宣言しない限り、アプリのサイズが強制的に変更されます。
</p>
<p>
アプリが画面の向きの固定を宣言しない場合、Android N を実行している端末でアプリを起動し、アプリを分割画面モードにすることを試みる必要があります。
アプリのサイズが強制的に変更されたときに、ユーザー エクスペリエンスが許容範囲内にあることを確認してください。
</p>
<p>
アプリが画面の向きの固定を宣言する場合、アプリをマルチ ウィンドウ モードにすることを試みる必要があります。
アプリをマルチ ウィンドウ モードにすることを試みたとき、アプリが全画面モードのままであることを確認してください。
</p>
<h3 id="test-mw">マルチ ウィンドウ モードをサポートする場合</h3>
<p>
アプリが N Preview SDK でビルドされていて、マルチ ウィンドウ モードが無効になっていない場合、分割画面モードとフリーフォーム モードの両方で次の動作を確認してください。
</p>
<ul>
<li>アプリを全画面モードで起動してから、[Overview] ボタンを長押しして、マルチ ウィンドウ モードに切り替えます。
モードが適切に切り替わることを確認します。
</li>
<li>アプリをマルチ ウィンドウ モードで直接起動し、アプリが適切に起動することを確認します。
[Overview] ボタンを押すと、アプリをマルチ ウィンドウ モードで起動できます。次に、アプリのタイトルバーを長押しし、アプリを画面上の強調表示された領域のいずれかにドラッグします。
</li>
<li>分割画面モードで分割線をドラッグして、アプリのサイズを変更します。
アプリがクラッシュせずに、アプリのサイズが変更され、必要な UI 要素が表示されることを確認します。
</li>
<li>アプリの最小ディメンションを指定している場合、アプリのサイズをそれらのディメンション以下にすることを試みてください。
アプリのサイズを指定最小ディメンションよりも小さくできないことを確認してください。
</li>
<li>すべてのテストを通じて、アプリのパフォーマンスが許容範囲内にあることを確認してください。たとえば、アプリのサイズを変更した後、UI の更新に大きな遅延がないことを確認してください。
</li>
</ul>
<h4 id="test-checklist">チェックリストのテスト</h4>
<p>
アプリのパフォーマンスをマルチ ウィンドウ モードで確認するには、以下の操作を試みてください。
特に記載のない限り、分割画面モードとマルチ ウィンドウ モードの両方でこれらの操作を試みる必要があります。
</p>
<ul>
<li>マルチ ウィンドウ モードを有効にしてから無効にします。
</li>
<li>1 つのアプリから別のアプリに切り替えたとき、最初のアプリの動作が適切であり、表示されているが、アクティブになっていないことを確認します。
たとえば、アプリが動画を再生している場合、ユーザーが別のアプリを操作しているときに、アプリで動画の再生が継続していることを確認します。
</li>
<li>分割画面モードで分割線を移動して、アプリの拡大および縮小を試みてください。
アプリを並べて表示しているときと重ねて表示しているときの両方でこれらの操作を試みてください。
アプリがクラッシュせず、基本的な機能が表示され、サイズ変更の操作に時間がかかり過ぎないことを確認します。
</li>
<li>続けざまにサイズ変更の操作を行います。アプリがクラッシュしたり、メモリリークが発生したりしないことを確認します。
アプリのメモリリークをチェックする方法の詳細については、<a href="{@docRoot}tools/debugging/debugging-memory.html">RAM の使用状況を調査する</a>をご覧ください。
</li>
<li>さまざまなウィンドウ構成でアプリを通常の方法で使用し、アプリが適切に動作することを確認します。
テキストが読み取り可能であり、UI 要素が操作に支障をきたすほど小さくないことを確認します。
</li>
</ul>
<h3 id="test-disabled-mw">マルチ ウィンドウのサポートを無効にしている場合</h3>
<p>
<code>android:resizableActivity="false"</code> を設定して、マルチ ウィンドウのサポートを無効にした場合は、Android N を実行している端末でアプリを起動し、アプリをフリーフォーム モードおよび分割画面モードにすることを試みる必要があります。
アプリをマルチ ウィンドウ モードにすることを試みたとき、アプリが全画面モードのままであることを確認してください。
</p>