android9多窗口下载.doc
在Android 9中,多窗口功能为用户提供了一种在单个屏幕上同时操作多个应用程序的方式,极大地提升了设备的生产力和用户体验。这一特性包括全屏、分屏、画中画(Picture-in-Picture, PiP)以及FreeForm模式。下面将详细阐述多窗口功能的工作原理、关键函数、生命周期管理和变更通知。 **工作原理** Android 9的多窗口功能基于多Stack方案,每个Stack代表了一个独立的活动区域,其中包含了不同的Activity。ActivityStack是抽象的栈结构,每个栈都有自己的边界和ID。例如,Launcher和Recents通常位于HOME_STACK_ID的栈中。Android 8.0引入了以下几种Stack ID: 1. HOME_STACK_ID:主屏幕栈。 2. FULLSCREEN_WORKSPACE_STACK_ID:全屏工作区栈。 3. FREEFORM_WORKSPACE_STACK_ID:自由形式栈。 4. DOCKED_STACK_ID:停靠栈。 5. PINNED_STACK_ID:固定栈。 6. RECENTS_STACK_ID:最近应用栈。 7. ASSISTANT_STACK_ID:助手栈。 ActivityStack和TaskStack在ActivityManagerService (AMS)与WindowManagerService (WMS)中分别被用来描述栈和任务。TaskRecord和Task用于表示任务,它们通过TaskId映射。Activity在所属ActivityStack的边界内显示,而FreeForm模式下,Activity的边界由其所在Task决定,而非Stack。 多窗口模式下,系统的焦点仅在一个Activity上,称为FocusActivity,它处于resume状态,而其他可见Activity则处于pause状态但不会停止。FocusStack指向FocusActivity所在的Stack。画中画模式下,浮层Activity不能成为FocusActivity,因此其Stack不是FocusStack。 **进入/退出多窗口的处理流程** 1. 调整ActivityStack:根据新的布局需求调整Stack。 2. 调整TaskStack:移动或改变Task的位置。 3. 调整Activity堆栈和WMS中的APPWindowToken堆栈:更新窗口和界面状态。 4. 调用Activity生命周期回调:如onResume和onPause。 5. 添加Window到WMS:创建或更新窗口。 6. 动画过渡和窗口显示:提供平滑的视觉效果。 **关键函数** 1. `moveTaskToStack()`: 移动Task到指定的Stack。 2. `moveTaskToDockedStack()`: 将Task移动到停靠Stack。 3. `moveTopActivityToPinnedStack()`: 将顶部Activity移动到固定Stack。 4. `swapDockedAndFullscreenStack()`: 切换停靠和全屏Stack。 5. `reparent()`: 用于8.0新增的分屏Task移动。 6. `resizeDockedStack()`和`resizePinnedStack()`: 调整停靠和固定Stack的大小。 7. `resumeTopActivityInnerLocked()`: 恢复栈顶Activity。 8. `startActivityUnchecked()`: 启动Activity。 **生命周期管理** 在多窗口模式下,Activity的生命周期会受到影响。例如,`Activity.onMultiWindowModeChanged()`和`Activity.onPictureInPictureModeChanged()`分别在Activity进入或退出多窗口模式和画中画模式时被调用,传递相应的布尔值表示状态变化。 **变更通知和查询** - `Activity.isInMultiWindowMode()`: 检查Activity是否在多窗口模式下。 - `Activity.isInPictureInPictureMode()`: 检查Activity是否在画中画模式下。 每个方法还涉及到Fragment的相应生命周期回调,使得应用可以适配多窗口环境,调整界面布局和交互。 Android 9的多窗口功能是通过复杂的栈管理和Activity生命周期控制实现的,允许用户同时进行多个任务,提高效率。开发人员可以通过特定的API和生命周期回调来监控和适应多窗口模式的变化,以提供最佳的用户体验。