Android实现一键开启自由窗口、分屏、画中画模式——自由窗口模式

article/2025/9/15 16:42:23

转载请注明出处:https://blog.csdn.net/sunmmer123

忙过一段时间后,新需求又来了“多个应用/页面间在不用退出或者切换的情况下,可同时操作”
咋一听是不是很迷惑,简单来说“此时你在爱奇艺刷着剧,不退出爱奇艺的情况下,照常能在微信聊着天”
这不是妥妥的时间管理大师嘛,众所周知,生活中我们也都是直接切到对应App中去,没有说同时不退出的情况下操作第二个App。

那么这种“高大上的”需求功能能实现么?
其实早在2016年5月19日, Google I/O 开发者大会中发布的Android N(7.0)新功能“多窗口模式”,就已经解决了这种一边刷剧一边聊天一边打游戏的需求了。

市面上大多数Android手机进入多窗口模式的入口.多任务下,长按对应应用页面,会出现按钮,点击进入。
“今天我们自己做一个入口,开启自由窗口模式,同时应用内的页面也可分屏互不影响操作。”


1、多窗口模式概念

看了大致的一个功能效果后,我们要了解一下多窗口模式的概念:多窗口模式就是指可以同时显示多个应用
Android 支持三种多窗口模式配置:

  • 自由窗口:允许用户动态调整应用窗格大小,并在屏幕上显示两个以上的应用,这种模式类似于我们常见的桌面操作系统
  • 分屏:是默认的多窗口模式实现,可为用户提供两个 Activity 窗格来放置应用。
  • 画中画 (PIP) :允许 Android 设备在用户与其他应用互动时在小窗口中播放视频内容。

详细的知识学习参考:Android 开源项目

2、要点分析

在了解学了原理性的知识点后,实现这些功能,其实都很简单,毕竟都是调用系统的API
这个demo的功能要点,我分为以下几点:

  • 如何实现打开自由窗口模式
  • 如何实现一键开启分屏模式
  • 如何实现画中画模式

围绕这三点,我分三篇博文和大家一起交流学习下

  • 一键开启进入自由窗口模式
  • 一键开启进入分屏模式
  • 一键进入画中画模式

自由窗口模式

自由窗口模式专业术语:freeform模式,它类似于Windows的窗口模式。进入了freeform模式后,窗口的顶部多两个操作按钮,表示放大当前窗口,相当于是“”全屏”,关掉当前的窗口。
先看效果:进入freeform模式后,俩个不同应用,无需退出第一个应用,直接打开第二个
在这里插入图片描述

1、如何实现打开自由窗口模式

google 默认freeform是关闭的,如果要测试需要手动开启。
打开的方式有俩种,我用的是第二种

  • 通过system feature定义:
    查看AOSP已经定义的Feature配置文件:frameworks/native/data/etc/android.software.freeform_window_management.xml,只需要把此文件push到手机的system/etc/permissions/目录下,开机时PMS会通过的读取此目录下xml配置开启freeform这个feature。

  • 增加开关通过Settings启动:
    adb shell settings put global enable_freeform_support 1
    开启自由窗口

  • 注意:
    1、有的手机通过以上Settings的方式启动不了,可以增加一句开启命令:

    • adb shell settings put global force_resizable_activities 1

    在这里插入图片描述
    2、开启后一定需要重启,功能才会生效
    3、重启后,查看下多窗口模式是否正常开起来了( 其实就是通过开启put时的字段,在获取的时候get一下)
    在这里插入图片描述

2、以自由窗口模式启动Activity

freeform模式打开后,我们如何以该模式打开应用。这里会涉及俩个关键知识点。
1、栈:

  • Android为了支持多窗口,在运行时创建了多个Stack。启动一个Activity之后,必定会将此Activity存放于某一个Stack。
    在Android N中,系统定义了5种Stack ID,每个Stack会有一个唯一的ID。简单可以理解为Stack就是类似虚拟桌面的作用。

2、ActivityOptions:

  • 系统根据ActivityOptions来控制启动的Task的栈边界的大小

掌握以上知识点后,看下开启代码:
在这里插入图片描述
在这里插入图片描述

3、如何以自由窗口模式启动系统所有应用

freefrom模式开启后,想要设备系统中的所有应用点击打开,都是以自由窗口模式打开的怎么做?

  • 其实原理和打开Activity的都一样,都是通过ActivityOptions进行反射设置一下Stack ID
  • 系统所有应用也就是包含那些系统应用,所以只要在framework拦截启动APP的入口,以自由窗口模式启动就可以。
    看下framework层启动代码:frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java ,在红框圈出来的地方,增加这俩句代码
    在这里插入图片描述
    在这里插入图片描述

以上,关于自由窗口的知识点就介绍完了
关于更加细节的freeform模式学习,可以看看这篇博客:android freeform模式定制桌面系统
Android源码系统源码下载路径:https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks

小补充点: 自由窗口模式里面,窗口支持放大缩小以及移动位置,原理是不断的更改Task的边界(用Rect表示),然后根据Task的边界来重新缩放Task,从而达到窗口缩放和拖动的作用。


接下去,可以继续学习多窗口模式中的 分屏模式 画中画模式

  • 一键开启进入分屏模式
  • 一键进入画中画模式

http://chatgpt.dhexx.cn/article/DaZnc6vE.shtml

相关文章

android6.0分屏插件,xposed分屏模块安卓6.0下载

安卓6.0系统分屏软件(xposed分屏插件)是一款支持分屏多任务软件,具有多窗口/双窗口功能,在众多智能分屏app中算是比较好用的啦,推荐给有需要的用户下载使用! 安卓6.0多窗口分屏软件简介 XHFW3在6.0下能用,很多以前的xp…

Android实现一键开启自由窗口、分屏、画中画模式——分屏模式

转载请注明出处:https://blog.csdn.net/sunmmer123 Android实现一键开启自由窗口、分屏、画中画模式系列 一键开启自由窗口模式一键开启进入分屏模式一键开启画中画模式 通过上一篇博文,我们学习了一些多窗口模式的基本概念以及如何自定义入口开启自由窗…

AndroidQ 分屏窗口尺寸计算 (WMS部分)

1. 分屏窗口尺寸计算 1.1 窗口添加到WMS Activity首次启动之后,在其resume阶段会将自己的Window添加到WMS: void makeVisible() {if (!mWindowAdded) {ViewManager wm getWindowManager();//顶层DecorViewwm.addView(mDecor, getWindow().getAttribut…

android T分屏流程

概览 分屏前的order Task display areas in top down Z order:TaskDisplayArea DefaultTaskDisplayAreamPreferredTopFocusableRootTaskTask{919dc1b #1 typehome ?? U0 visibletrue visibleRequestedtrue modefullscreen translucentfalse sz1}mLastFocusedRootTaskTask{919…

android 分屏切换流程,一种切换分屏模式和多窗口模式的方法与流程

本发明涉及一种切换分屏模式和多窗口模式的方法,适用于常见的带有触摸的电子设备,包括但不限于在系统的用户界面中使用触摸的方法进行导航的电子设备。 背景技术: 分屏模式是一种将两个应用扩充到全屏幕的交互方法。近几年随着技术的发展,使用触摸作为设备的输入方式已经被…

Android 分屏模式-多窗口支持

第一篇博客请多多担待,测试一下。 来自于https://developer.android.com/guide/topics/ui/multi-window.html#lifecycle Android N 添加了同时显示多个应用窗口的支持,在手持设备上,两个应用可以在“分屏”模式中左右并排或者上下并排显示。…

AndroidQ 分屏窗口模式 (AMS部分)

1. 多窗口 1.1 栈 Android7.0开始支持多窗口,多窗口分为三种,画中画,分屏,自由窗口,多窗口的核心原理其实就是分栈和设置栈边界, 分栈即把不同窗口模式下的Activity放在不同的ActivityStack中&#xff0…

Android分屏显示(多窗口支持) 开发总结

最近公司有分屏显示需求,遇到几点问题 ,在此记录,以做备忘。 我所谓的分屏显示,是在同一个界面内,分屏显示两个app的界面 或者是 注意点1: 系统好像没有获取应用显示的左右或者上下位置的方法,…

android安卓手机分屏多窗口实现方法

效果图 frameborder"0" allowtransparency"true" scrolling"no" vspace"0" hspace"0" style"display: block; position: static; padding: 0px; margin: 0px; border-style: none; vertical-align: baseline; width: 3…

Android实现一键开启自由窗口、分屏、画中画模式——画中画模式

转载请注明出处:https://blog.csdn.net/sunmmer123 Android实现一键开启自由窗口、分屏、画中画模式系列 一键开启进入自由窗口模式一键开启进入分屏模式一键进入画中画模式 通过前俩篇博文,我们学习了一些多窗口模式中的自由窗口模式与分屏模式的知识 最…

Android多窗口模式(分屏模式)

Android N 支持多窗口模式,或者叫分屏模式,即在屏幕上可以同时显示多个窗口。 在手机模式下,两个应用可以并排或者上下同时显示,如图 1 所示,屏幕上半部分的窗口是系统的 CLOCK 应用,下半部分是系统设置功能…

git 命令怎么创建新分支?

问题 比如:我们要以 dev 分支创建一个 test-branch 分支。 解决 1、在本地创建一个 test-branch 分支,并切换到该分支。 git checkout -b test-branch执行完,可以使用下面命令查看是否创建了该本地分支 git branch -a2、把分支推到远程仓…

git命令之快速搭建远程仓库

首先使用系统管理员账号登录远程服务器,具体步骤如下所示: 1 安装git应用程序 sudo apt-get install git 2 创建git用户组和git用户,具体命令如下所示: groupadd git adduser git -g git 3 修改git用户默认shell为git-shell…

Git命令常用操作 代码拉取和提交

常规的git命令就是以下几个语句 项目首次拉取 git clone 项目地址url拉取并同步代码到本地 git pull将本地所有更改的文件添加到缓存区 git add .添加备注,方便之后查看历史提交记录 git commit -m "本次提交备注信息"提交到git仓库 git push

git命令之新建仓库

一. 配置git用户名 1)安装git,配置用户名和邮箱 git config --global user.name "你的用户名" git config --global user.email "你的注册邮箱" 2)使用git config --global --list查看配置 二. 工作区操作 1&#x…

常见Git命令使用

常见Git命令使用 1.初始化创库 git init 2.git status 这个命令顾名思义就是查看状态, 这个命令可以算是使用最频繁的一个命令了, 建议大家没事就输入下这个命令, 来查看你当前 git 仓库的一些状态。 3.git add 文件名 将文件添加到git仓库…

git命令拉取代码

流程 1在本地clone项目【保持与远程仓库一致】 此时已绑定远程仓库 git clone xxxx2.添加文件 3.放到暂存区 git add .4.提交到本地仓库 git commint -m "提示信息"5推送到远程仓库 git push origin master其他命令 分支命令 分支就是每个人开发 互不影响 之后…

Git 命令之stash

Git 命令之stash 前言1 stash1.1 描述1.2 应用场景命令使用 前言 使用 Git 作为代码版本管理,早已是现在开发工程师必备的技能。可大多数工程师还是只会最基本的保存、拉取、推送,遇到一些commit管理的问题就束手无策,或者用一些不优雅的方式…

git命令登录

1. 执行登陆用户名和密码命令 git config --global user.email "youexample.com" git config --global user.name "Your Name"2. 生成密钥对 ssh-keygen -t rsa -C "your_emailyouremail.com"3. 配置公钥私钥 然后将 .ssh/id_rsa.pub中的内容复…

git命令详解

一、简介 git作为应用广泛的一种分布式版本控制系统,其与svn比较最大的差别就是一个是分布式,一个是集中式,git在每个开发者的本地有一个完整的版本库,当在本地处理工作时,无需联网便可修改提交,当需要与其…