Updating TOC, adjusting page names...that sort of thing. Change-Id: I1a6cf66291344e5c210f287c1d38c65d621cfe91
506 lines
17 KiB
Plaintext
506 lines
17 KiB
Plaintext
page.title=Multi-Window Support
|
||
page.metaDescription=New support in the N Developer Preview for showing more than one app at a time.
|
||
page.keywords="multi-window", "android N", "split screen", "free-form"
|
||
|
||
@jd:body
|
||
|
||
<div id="qv-wrapper">
|
||
<div id="qv">
|
||
<h2>In this document</h2>
|
||
<ol>
|
||
<li><a href="#overview">Overview</a></li>
|
||
<li><a href="#lifecycle">Multi-Window Lifecycle</a></li>
|
||
<li><a href="#configuring">Configuring Your App for Multi-Window
|
||
Mode</a></li>
|
||
<li><a href="#running">Running Your App in Multi-Window Mode</a></li>
|
||
<li><a href="#testing">Testing Your App's Multi-Window Support</a></li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
|
||
<p>
|
||
The N Developer Preview adds support for displaying more than one app at the
|
||
same time. On handheld devices, two apps can run side-by-side or
|
||
one-above-the-other in <em>split-screen</em> mode. On TV devices, apps can
|
||
use <em>picture-in-picture</em> mode to continue video playback while users
|
||
are interacting with another app.
|
||
</p>
|
||
|
||
<p>
|
||
If you build your app with the N Preview SDK, you can configure how your app
|
||
handles multi-window display. For example, you can specify your activity's
|
||
minimum allowable dimensions, preventing users from making the activity
|
||
window smaller than that size. You can also disable multi-window display for
|
||
your app, ensuring that the system only shows your app in full-screen
|
||
mode.
|
||
</p>
|
||
|
||
<h2 id="overview">Overview</h2>
|
||
|
||
<p>
|
||
The N Developer Preview allows several apps to share the screen at once. For
|
||
example, a user could split the screen, viewing a web page on the left side
|
||
while composing an email on the right side. The user experience depends on
|
||
the device:
|
||
</p>
|
||
|
||
<ul>
|
||
<li>Handheld devices running the N Developer Preview offer split-screen
|
||
mode. In this mode, the system fills the screen with two apps, showing them
|
||
either side-by-side or one-above-the-other. The user can drag the dividing
|
||
line separating the two to make one app larger and the other smaller.
|
||
</li>
|
||
|
||
<li>On Nexus Player running the N Developer Preview, apps can put themselves
|
||
in picture-in-picture mode, allowing them to continue showing content
|
||
while the user browses or interacts with other apps. For more information,
|
||
see <a href="picture-in-picture.html">Picture-in-picture</a>.
|
||
</li>
|
||
|
||
<li>Manufacturers of larger devices can choose to enable freeform
|
||
mode, in which the user can freely resize each activity. If the
|
||
manufacturer enables this feature, the device offers freeform mode in addition
|
||
to split-screen mode.
|
||
</li>
|
||
</ul>
|
||
|
||
<img src="{@docRoot}preview/images/mw-splitscreen.png" alt="" width="641"
|
||
id="img-split-screen" />
|
||
<p class="img-caption">
|
||
<strong>Figure 1.</strong> Two apps running side-by-side in split-screen mode.
|
||
</p>
|
||
|
||
<p>
|
||
The user can switch into multi-window mode in the following ways:
|
||
</p>
|
||
|
||
<ul>
|
||
<li>If the user opens the <a href="{@docRoot}guide/components/recents.html">Overview
|
||
screen</a> and performs a long press on an
|
||
activity title, they can drag that activity to a highlighted portion of the
|
||
screen to put the activity in multi-window mode.
|
||
</li>
|
||
|
||
<li>If the user performs a long press on the Overview button, the device puts
|
||
the current activity in multi-window mode, and opens the Overview screen to
|
||
let the user choose another activity to share the screen.
|
||
<!-- ***TODO: screenshot*** -->
|
||
</li>
|
||
</ul>
|
||
|
||
<h2 id="lifecycle">Multi-Window Lifecycle</h2>
|
||
|
||
<p>
|
||
Multi-window mode does not change the <a href=
|
||
"{@docRoot}training/basics/activity-lifecycle/index.html">activity
|
||
lifecycle</a>.
|
||
</p>
|
||
|
||
<p>
|
||
In multi-window mode, only the activity the user has most recently interacted
|
||
with is active at a given time. This activity is considered <em>topmost</em>.
|
||
All other activities are in the paused state, even if they are visible.
|
||
However, the system gives these paused-but-visible activities higher priority
|
||
than activities that are not visible. If the user interacts with one of the
|
||
paused activities, that activity is resumed, and the previously topmost
|
||
activity is paused.
|
||
</p>
|
||
|
||
<p class="note">
|
||
<strong>Note:</strong> In multi-window mode, an app can be in the paused
|
||
state and still be visible to the user. An app might need to continue its
|
||
activities even while paused. For example, a video-playing app that is in
|
||
paused mode but is visible should continue showing its video.
|
||
</p>
|
||
|
||
<p>
|
||
When the user puts an app into multi-window mode, the system notifies the
|
||
activity of a configuration change, as specified in <a href=
|
||
"{@docRoot}guide/topics/resources/runtime-changes.html">Handling Runtime
|
||
Changes</a>. Essentially, this change has the same activity-lifecycle
|
||
implications as when the system notifies the app that the device has switched
|
||
from portrait to landscape mode, except that the device dimensions are
|
||
changed instead of just being swapped. As discussed in <a href=
|
||
"{@docRoot}guide/topics/resources/runtime-changes.html">Handling Runtime
|
||
Changes</a>, your activity can handle the configuration change itself, or it
|
||
can allow the system to destroy the activity and recreate it with the new
|
||
dimensions.
|
||
</p>
|
||
|
||
<p>
|
||
If the user is resizes a window and makes it larger in either dimension,
|
||
the system fills in the expanded
|
||
area with the color specified by the {@link android.R.attr#windowBackground
|
||
windowBackground} attribute, or by the default
|
||
<code>windowBackgroundFallback</code> style attribute. When the user finishes
|
||
resizing the window, the activity is redrawn with its new dimensions, as
|
||
described in <a href=
|
||
"{@docRoot}guide/topics/resources/runtime-changes.html">Handling Runtime
|
||
Changes</a>.
|
||
</p>
|
||
|
||
<h2 id="configuring">Configuring Your App for Multi-Window Mode</h2>
|
||
|
||
<p>
|
||
If your app targets the N Developer Preview, you can configure how and
|
||
whether your app's activities support multi-window display. You can set
|
||
attributes in your manifest to control both size and layout.
|
||
A root activity's attribute settings apply to all activities
|
||
within its task stack.
|
||
</p>
|
||
|
||
<p class="note">
|
||
<strong>Note:</strong> If you build a multi-orientation app with a version of the
|
||
SDK earlier than the N Developer Preview, and the user uses the app in
|
||
multi-window mode, the system forcibly resizes the app. The system presents a
|
||
dialog box warning the user that the app may behave unexpectedly. The system
|
||
does <em>not</em> resize fixed-orientation apps; if
|
||
the user attempts to open a fixed-orientation app under multi-window mode,
|
||
the app takes over the whole screen.
|
||
</p>
|
||
|
||
<h4 id="resizeableActivity">android:resizeableActivity</h4>
|
||
<p>
|
||
Set this attribute in your manifest's <code><activity></code> or
|
||
<code><application></code> node to enable or disable multi-window
|
||
display:
|
||
</p>
|
||
|
||
<pre>
|
||
android:resizableActivity=["true" | "false"]
|
||
</pre>
|
||
|
||
<p>
|
||
If this attribute is set to true, the activity can be launched in
|
||
split-screen and freeform modes. If the attribute is set to false, the
|
||
activity does not support multi-window mode. If this value is false, and the
|
||
user attempts to launch the activity in multi-window mode, the activity takes
|
||
over the full screen.
|
||
</p>
|
||
|
||
<p>
|
||
If your app targets the N Developer Preview, but you do not specify a value
|
||
for this attribute, the attribute's value defaults to true.
|
||
</p>
|
||
|
||
<h4 id="supportsPictureInPicture">android:supportsPictureInPicture</h4>
|
||
|
||
<p>
|
||
Set this attribute in your manifest's <code><activity></code> node to
|
||
indicate whether the activity supports picture-in-picture display.
|
||
</p>
|
||
|
||
<pre>
|
||
android:supportsPictureInPicture=["true" | "false"]
|
||
</pre>
|
||
|
||
<h3 id="layout">Layout attributes</h3>
|
||
|
||
<p>
|
||
With the N Developer Preview, the <code><layout></code> manifest element
|
||
supports several attributes that affect how an activity behaves in
|
||
multi-window mode:
|
||
</p>
|
||
|
||
<dl>
|
||
<dt>
|
||
<code>android:defaultWidth</code>
|
||
</dt>
|
||
|
||
<dd>
|
||
Default width of the activity when launched in freeform mode.
|
||
</dd>
|
||
|
||
<dt>
|
||
<code>android:defaultHeight</code>
|
||
</dt>
|
||
|
||
<dd>
|
||
Default height of the activity when launched in freeform mode.
|
||
</dd>
|
||
|
||
<dt>
|
||
<code>android:gravity</code>
|
||
</dt>
|
||
|
||
<dd>
|
||
Initial placement of the activity when launched in freeform mode. See the
|
||
{@link android.view.Gravity} reference for suitable values.
|
||
</dd>
|
||
|
||
<dt>
|
||
<code>android:minimalSize</code>
|
||
</dt>
|
||
|
||
<dd>
|
||
Minimum height and minimum width for the activity in both split-screen
|
||
and freeform modes. The system does not permit the user to resize the
|
||
activity below the specified size in either dimension.
|
||
</dd>
|
||
</dl>
|
||
|
||
<p>
|
||
For example, the following code shows how to specify an activity's default
|
||
size and location, and its minimum size, when the activity is displayed in
|
||
freeform mode:
|
||
</p>
|
||
|
||
<pre>
|
||
<activity android:name=".MyActivity">
|
||
<layout android:defaultHeight="500dp"
|
||
android:defaultWidth="600dp"
|
||
android:gravity="top|end"
|
||
android:minimalSize="450dp" />
|
||
</activity>
|
||
</pre>
|
||
|
||
<h2 id="running">Running Your App in Multi-Window Mode</h2>
|
||
|
||
<p>
|
||
The N Developer Preview offers new functionality to support apps that can run
|
||
in multi-window mode.
|
||
</p>
|
||
|
||
<h3 id="disabled-features">Disabled features in multi-window mode</h3>
|
||
|
||
<p>
|
||
Certain features are disabled or ignored when a device is in multi-window
|
||
mode, because they don’t make sense for an activity which may be sharing the
|
||
device screen with other activities or apps. Such features include:
|
||
|
||
<ul>
|
||
<li>Some <a href="{@docRoot}training/system-ui/index.html">System UI</a>
|
||
customization options are disabled; for example, apps cannot hide the status
|
||
bar if they are not running in full-screen mode.
|
||
</li>
|
||
|
||
<li>The system ignores changes to the <code><a href=
|
||
"{@docRoot}guide/topics/manifest/activity-element.html#screen"
|
||
>android:screenOrientation</a></code> attribute.
|
||
</li>
|
||
</ul>
|
||
|
||
<h3 id="change-notification">Multi-window change notification and querying</h3>
|
||
|
||
<p>
|
||
The following new methods have been added to the {@link android.app.Activity}
|
||
class to support multi-window display. For details on each method, see the
|
||
<!--TODO: Add link to preview download page-->
|
||
N Preview SDK Reference.
|
||
</p>
|
||
|
||
<dl>
|
||
<dt>
|
||
<code>Activity.inMultiWindow()</code>
|
||
</dt>
|
||
|
||
<dd>
|
||
Call to find out if the activity is in multi-window mode.
|
||
</dd>
|
||
|
||
<dt>
|
||
<code>Activity.inPictureInPicture()</code>
|
||
</dt>
|
||
|
||
<dd>
|
||
Call to find out if the activity is in picture-in-picture mode.
|
||
|
||
<p class="note">
|
||
<strong>Note:</strong> Picture-in-Picture mode is a special case of
|
||
multi-window mode. If <code>myActivity.inPictureInPicture()</code>
|
||
returns true, then <code>myActivity.inMultiWindow()</code> also returns
|
||
true.
|
||
</p>
|
||
</dd>
|
||
|
||
<dt>
|
||
<code>Activity.onMultiWindowChanged()</code>
|
||
</dt>
|
||
|
||
<dd>
|
||
The system calls this method whenever the activity goes into or out of
|
||
multi-window mode. The system passes the method a value of true if the
|
||
activity is entering multi-window mode, and false if the activity is
|
||
leaving multi-window mode.
|
||
</dd>
|
||
|
||
<dt>
|
||
<code>Activity.onPictureInPictureChanged()</code>
|
||
</dt>
|
||
|
||
<dd>
|
||
The system calls this method whenever the activity goes into or out of
|
||
picture-in-picture mode. The system passes the method a value of true if
|
||
the activity is entering picture-in-picture mode, and false if the activity
|
||
is leaving picture-in-picture mode.
|
||
</dd>
|
||
</dl>
|
||
|
||
<p>
|
||
There are also {@link android.app.Fragment} versions of each of these
|
||
methods, for example <code>Fragment.inMultiWindow()</code>.
|
||
</p>
|
||
|
||
<h3 id="entering-pip">Entering Picture-in-Picture Mode</h3>
|
||
|
||
<p>
|
||
To put an activity in picture-in-picture mode, call the new method
|
||
<code>Activity.enterPictureInPicture()</code>. This method has no effect if
|
||
the device does not support picture-in-picture mode. For more information,
|
||
see <!-- TODO: Link to new N-Preview PIP doc-->
|
||
Picture-in-Picture Mode.
|
||
</p>
|
||
|
||
<h3 id="launch">Launch New Activities in Multi-Window Mode</h3>
|
||
|
||
<p>
|
||
When you launch a new activity, you can hint to the system that the new
|
||
activity should be displayed adjacent to the current one, if possible. To do
|
||
this, use the flag
|
||
<code>Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT</code>. Passing
|
||
this flag requests the following behavior:
|
||
</p>
|
||
|
||
<ul>
|
||
<li>If the device is in split-screen mode, the system attempts to create the
|
||
new activity next to the activity that launched it, so the two activities
|
||
share the screen. The system is not guaranteed to be able to do this, but it
|
||
makes the activities adjacent if possible.
|
||
</li>
|
||
|
||
<li>If the device is not in split-screen mode, this flag has no effect.
|
||
</li>
|
||
</ul>
|
||
|
||
<p>
|
||
If a device is in freeform mode and you are launching a new activity, you can
|
||
specify the new activity's dimensions and screen location by calling
|
||
<code>ActivityOptions.setLaunchBounds()</code>. This method has no effect if
|
||
the device is not in multi-window mode.
|
||
</p>
|
||
|
||
<p class="note">
|
||
<strong>Note:</strong> If you launch an activity within a task stack, the
|
||
activity replaces the activity on the screen, inheriting all of its
|
||
multi-window properties. If you want to launch the new activity as a separate
|
||
window in multi-window mode, you must launch it in a new task stack.
|
||
</p>
|
||
|
||
<h2 id="testing">Testing Your App's Multi-Window Support</h2>
|
||
|
||
<p>
|
||
Whether or not you update your app for the N Developer Preview, you should
|
||
verify how it behaves in multi-window mode in case a user tries to launch it
|
||
in multiwindow mode on a device running the N Developer Preview.
|
||
</p>
|
||
|
||
<h3 id="configuring">Configuring a Test Device</h3>
|
||
|
||
<p>
|
||
If you install the N Developer Preview on a device, split-screen mode is
|
||
automatically supported.
|
||
</p>
|
||
|
||
<h3 id="test-non-n">If your app was not built with the N Preview SDK</h3>
|
||
|
||
<p>
|
||
If you did not build your app with the N Preview SDK and the user attempts to use
|
||
the app in multi-window mode, the system forcibly resizes the app unless the app
|
||
declares a fixed orientation.
|
||
</p>
|
||
|
||
<p>
|
||
If your app does not declare a fixed orientation, you should launch your app
|
||
on a device running the N Developer Preview and attempt to put the app in
|
||
split-screen mode. Verify that the user experience is
|
||
acceptable when the app is forcibly resized.
|
||
</p>
|
||
|
||
<p>
|
||
If the app declares a fixed orientation, you should attempt to put the app in
|
||
multi-window mode. Verify that when you do so, the app remains
|
||
in full-screen mode.
|
||
</p>
|
||
|
||
<h3 id="test-mw">If you support multi-window mode</h3>
|
||
|
||
<p>
|
||
If you built your app with the N Preview SDK and have not disabled
|
||
multi-window support, verify the following behavior under both split-screen
|
||
and freeform modes.
|
||
</p>
|
||
|
||
<ul>
|
||
<li>Launch the app in full-screen mode, then switch to multi-window mode by
|
||
long-pressing the Overview button. Verify that the app switches properly.
|
||
</li>
|
||
|
||
<li>Launch the app directly in multi-window mode, and verify that the app
|
||
launches properly. You can launch an app in multi-window mode by pressing the
|
||
Overview button, then long-pressing the title bar of your app and dragging it
|
||
to one of the highlighted areas on the screen.
|
||
</li>
|
||
|
||
<li>Resize your app in split-screen mode by dragging the divider line.
|
||
Verify that the app resizes without crashing, and that necessary UI elements
|
||
are visible.
|
||
</li>
|
||
|
||
<li>If you have specified minimum dimensions for your app, attempt to resize
|
||
the app below those dimensions. Verify that you cannot resize the app to be
|
||
smaller than the specified minimum.
|
||
</li>
|
||
|
||
<li>Through all tests, verify that your app's performance is acceptable. For
|
||
example, verify that there is not too long a lag to update the UI after the
|
||
app is resized.
|
||
</li>
|
||
</ul>
|
||
|
||
<h4 id="test-checklist">Testing checklist</h4>
|
||
|
||
<p>
|
||
To verify your app's performance in multi-window mode, try the following
|
||
operations. You should try these operations in both split-screen and
|
||
multi-window mode, except where otherwise noted.
|
||
</p>
|
||
|
||
<ul>
|
||
<li>Enter and leave multi-window mode.
|
||
</li>
|
||
|
||
<li>Switch from your app to another app, and verify that the app behaves
|
||
properly while it is visible but not active. For example, if your app is
|
||
playing video, verify that the video continues to play while the user is
|
||
interacting with another app.
|
||
</li>
|
||
|
||
<li>In split-screen mode, try moving the dividing bar to make your app both
|
||
larger and smaller. Try these operations in both side-by-side and
|
||
one-above-the-other configurations. Verify that the app does not crash,
|
||
essential functionality is visible, and the resize operation doesn't take too
|
||
long.
|
||
</li>
|
||
|
||
<li>Perform several resize operations in rapid succession. Verify that your
|
||
app doesn't crash or leak memory. For information about checking your app's
|
||
memory usage, see <a href="{@docRoot}tools/debugging/debugging-memory.html">
|
||
Investigating Your RAM Usage</a>.
|
||
</li>
|
||
|
||
<li>Use your app normally in a number of different window configurations, and
|
||
verify that the app behaves properly. Verify that text is readable, and that
|
||
UI elements aren't too small to interact with.
|
||
</li>
|
||
</ul>
|
||
|
||
<h3 id="test-disabled-mw">If you have disabled multi-window support</h3>
|
||
|
||
<p>
|
||
If you disabled multi-window support by setting
|
||
<code>android:resizableActivity="false"</code>, you should launch your app on
|
||
a device running the N Developer Preview and attempt to put the app in
|
||
freeform and split-screen modes. Verify that when you do so, the app remains
|
||
in full-screen mode.
|
||
</p>
|