MULTI-Window Support
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. You can also disable multi-window display for your app, ensuring that the system only shows your app in full-screen mode.
Overview
Android N 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:
- Handheld devices running Android N 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.
- On Nexus Player running Android N, apps can put themselves in picture-in-picture mode, allowing them to continue showing content while the user browses or interacts with other apps.
- 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.
- If the user opens the Overview screen 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.
- 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.
Multi-Window Lifecycle
Multi-window mode does not change the activity lifecycle.
In multi-window mode, only the activity the user has most recently interacted with is active at a given time. This activity is considered topmost. 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.
Note: 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. For this reason, we recommend that activities that play video not pause the video in their
When the user puts an app into multi-window mode, the system notifies the activity of a configuration change, as specified in Handling Runtime Changes. 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 Handling Runtime Changes, 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. onPause()
handlers. Instead, they should pause video in onStop()
, and resume playback in onStart()
. If the user is resizing a window and makes it larger in either dimension, the system resizes the activity to match the user action and issues runtime changes as needed. If the app lags behind in drawing in newly-exposed areas, the system temporarily fills those areas with the color specified by the
windowBackground
attribute or by the default windowBackgroundFallback
style attribute. Configuring Your App for Multi-Window Mode
If your app targets Android N, 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.
Note: If you build a multi-orientation app with a version of the SDK lower than Android N, 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 not 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.
android:resizeableActivity
Set this attribute in your manifest's<activity>
or <application>
node to enable or disable multi-window display: android:resizeableActivity=["true" | "false"]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.
If your app targets Android N, but you do not specify a value for this attribute, the attribute's value defaults to true.
android:supportsPictureInPicture
Set this attribute in your manifest's<activity>
node to indicate whether the activity supports picture-in-picture display. This attribute is ignored if android:resizeableActivity
is false. android:supportsPictureInPicture=["true" | "false"]
Layout attributes
With Android N, the<layout>
manifest element supports several attributes that affect how an activity behaves in multi-window mode: android:defaultWidth
- Default width of the activity when launched in freeform mode.
android:defaultHeight
- Default height of the activity when launched in freeform mode.
android:gravity
- Initial placement of the activity when launched in freeform mode. See the
Gravity
reference for suitable values. android:minimalSize
- Minimum height and minimum width for the activity in both split-screen and freeform modes. If the user moves the divider in split-screen mode to make an activity smaller than the specified minimum, the system crops the activity to the size the user requests.
<activity android:name=".MyActivity"> <layout android:defaultHeight="500dp" android:defaultWidth="600dp" android:gravity="top|end" android:minimalSize="450dp" /> </activity>
Running Your App in Multi-Window Mode
Android N offers new functionality to support apps that can run in multi-window mode.
Disabled features in multi-window mode
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:- Some System UI customization options are disabled; for example, apps cannot hide the status bar if they are not running in full-screen mode.
- The system ignores changes to the
android:screenOrientation
attribute.
Multi-window change notification and querying
The following new methods have been added to theActivity
class to support multi-window display. For details on each method, see the N Preview SDK Reference. Activity.inMultiWindow()
- Call to find out if the activity is in multi-window mode.
Activity.inPictureInPicture()
- Call to find out if the activity is in picture-in-picture mode. Note: Picture-in-picture mode is a special case of multi-window mode. If
myActivity.inPictureInPicture()
returns true, thenmyActivity.inMultiWindow()
also returns true. Activity.onMultiWindowChanged()
- 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.
Activity.onPictureInPictureChanged()
- 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.
Fragment
versions of each of these methods, for example Fragment.inMultiWindow()
. Entering picture-in-picture mode
To put an activity in picture-in-picture mode, call the new methodActivity.enterPictureInPicture()
. This method has no effect if the device does not support picture-in-picture mode. For more information, see the Picture-in-Picture documentation. Launch New Activities in Multi-Window Mode
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 flagIntent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT
. Passing this flag requests the following behavior: - 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.
- If the device is not in split-screen mode, this flag has no effect.
ActivityOptions.setLaunchBounds()
. This method has no effect if the device is not in multi-window mode.
Note: 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.
Supporting drag and drop
Users can drag and drop data from one activity to another while the two activities are sharing the screen. (Previously, users could only drag and drop data within a single activity.) For this reason, you may want to add drag and drop functionality to your app if your app does not currently support it.The N Preview SDK extends the
android.view
package to support cross-app drag and drop. For details on the following classes and methods, see the N Preview SDK Reference. android.view.DropPermissions
- Token object responsible for specifying the permissions granted to the app that receives a drop.
View.startDragAndDrop()
- New alias for
View.startDrag()
. To enable cross-activity drag and drop, pass the new flagView.DRAG_FLAG_GLOBAL
. If you need to give URI permissions to the recipient activity, pass the new flagsView.DRAG_FLAG_GLOBAL_URI_READ
orView.DRAG_FLAG_GLOBAL_URI_WRITE
, as appropriate. View.cancelDragAndDrop()
- Cancels a drag operation currently in progress. Can only be called by the app that originated the drag operation.
View.updateDragShadow()
- Replaces the drag shadow for a drag operation currently in progress. Can only be called by the app that originated the drag operation.
Activity.requestDropPermissions()
- Requests the permissions for the content URIs passed with the
ClipData
contained in aDragEvent
.
Testing Your App's Multi-Window Support
Whether or not you update your app for Android N, 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 Android N.
Configuring a Test Device
If you install Android N on a device, split-screen mode is automatically supported.If your app was not built with the N Preview SDK
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.If your app does not declare a fixed orientation, you should launch your app on a device running Android N and attempt to put the app in split-screen mode. Verify that the user experience is acceptable when the app is forcibly resized.
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.
If you support multi-window mode
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.- 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.
- 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.
- 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.
- 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.
- 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.
Testing checklist
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.- Enter and leave multi-window mode.
- 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.
- 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.
- 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 Investigating Your RAM Usage.
- 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.
If you have disabled multi-window support
If you disabled multi-window support by settingandroid:resizableActivity="false"
, you should launch your app on a device running Android N 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.
Comments
Post a Comment