在Android N上开启freeform功能后,我们可以修改开启freeform功能如何开启freeform功能,但是Google只是的默认行为比较简单,我们只能在任务列表中进入分屏,在分屏状态下点击进入全屏的btn进入全屏,由于前面文章的介绍,freeform和fullscreen只是不同的两个stack,我们可以通过taskid把应用在不同的stack中移动,来达到freeform或者是fullscreen效果。
在把全屏应用编程freeform状态时,我们可以使用如下代码:
ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchStackId(FREEFORM_WORKSPACE_STACK_ID);
ActivityManagerService.startActivityFromRecents(int taskId, Bundle bOptions)
这段代码就是启用一个app,但是设置它所在的stack是freeform,从而实现这个应用是freeform状态。这段代码最后会执行到
ActivityStackSupervisor.startActivityFromRecentsInner(...)
这里有几点需要说明:
- launchStackId就是设置的到移动到的stackid,例如要把app移动到freeform,这里的值就是2.
- task.stack.mStackId 这里的stackid就是要移动的app,当前的stackid,例如在移动前应用是处于全屏状态,那么这个值就是1.
- 如果launchStackId跟task.stack.mStackId的值不相同,那么就会就会执行到 moveTaskToStackLocked(…)方法中,这个方法就会修改应用的bounds(即修改要移动app的bounds),在这个方法中需要注意如果是全屏要移动到freeform,task.mBounds是null(因为我们在计算fullscreen时,它的bounds是null,可以这么说全屏应用的bounds就是null),这时会自动获取一个bounds,来根据这个计算要修改应用最终的bounds,如果app的上一个应用状态是从分屏进入到的全屏,在修改成freeform,这个bounds就会是全屏大小,这时显示就会异常,一定要给一个默认的显示bounds值。。。。