android 更改窗口的层次,浮窗开发之窗口层级_Ms.Bu的博客-程序员宅基地

技术标签: android 更改窗口的层次  

最近在项目中遇到了这样的需求:需要在特定的其他应用之上悬浮自己的UI交互(拖动、输入等复杂的UI交互),和九游的浮窗类似,不过我们的比九游的体验更好,我们越过了很多授权的限制。

b4c23dee9206

浮窗效果

很多人都知道如何去实现一个简单的浮窗,但是却很少有人去深入的研究背后的流程机制,由于项目中浮窗交互比较复杂,遇到了些坑查看了很多资料,故总结浮窗涉及到的知识点:

窗口层级关系(浮窗是如何“浮”的)?

浮窗有哪些限制,如何越过用户授权实现浮窗功能?

窗口与用户输入系统(Activity是如何接收到touch事件的)?

本章我们来研究第一个问题:浮窗为何会浮。浮窗之所以叫浮窗,是因为它能悬浮于应用或者桌面窗口之上,能脱离Activity而存在。为了研究其中区别,我们先来看看我们最熟悉的Activity是怎么显示出来的。

Activity是怎么显示出来的?

要弄清这个问题答案,我们先从Activity的setContentView()这个方法的源码开始找起,在Activity中看到setCententView的源码:

public void setContentView(int layoutResID) {

getWindow().setContentView(layoutResID);

initWindowDecorActionBar();

}

getWindow是返回返回Activity的mWindow变量,指向一个Window的对象,Window是一个抽象类,这里返回的是PhoneWindow对象(PhoneWindow是Window的子类),PhoneWindow中有一个DecorView对象,decorView成员,这是一个FrameLayout,setContentView的子布局最终会添加到decorView中,这个decorView就是当前窗口的根视图,这个根视图是如何最终被绘制出来的?在ActivityThread中有这样一段代码:

l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;

l.softInputMode |= forwardBit;

if (a.mVisibleFromClient) {

a.mWindowAdded = true;

wm.addView(decor, l);

}

这个decorView,最终会被WindowManager.addView添加到绘制系统中,并类型是WindowManager.LayoutParams.TYPE_BASE_APPLICATION,这个参数决定了要绘制的窗口的z轴层次,为了避免思维栈过深,这里就不贴出详细的源码跟踪过程了,直接给结论。

先来看看Activity和window的关系:

b4c23dee9206

Activity-window.jpg

再来window和View的关系:

b4c23dee9206

window-view.jpg

Activity窗口显示过程:

b4c23dee9206

Activity的显示过程.png

说Activity是怎么显示出来的,其实是说Activity管理的View是怎么显示出来的。最后再来总结一下:

一、Activity通过setContentView设置的视图是添加到PhoneWindow的根视图decor中。

二、Window是一个抽象的概念,Window关了了一个View(根视图),最终被WindowManager管理的还是一个View(根视图)和它的LayoutParams,视图绘制刷新都是通过WindowManager(WindowManagerGlobal)与WindowManagerServiceIPC交互调用底层绘制的。

三、Activity是四大组件中唯一和窗体紧密联系的组件(这是为什么会有初学者把Activity直接理解为绘制界面的原因),所有掌管的视图只不过是一种window和Dialog、Toast、墙纸所掌管的Window类型不一样。

浮窗为什么会“浮”?

上面讲到Activity的显示过程其实已经揭示了通用界面的显示过程,浮窗的显示过程更为简单:

b4c23dee9206

通用窗体绘制过程.png

做过浮窗的同学应该都明白了,为啥浮窗能脱离Activity而显示,本质上我们是把一个View交给WindowManager来管理了,LayoutParams.type类型决定了这个View显示窗口的类型,不同类型显示的窗口层次(z轴)是不一样的。大方面来讲可以分为应用窗口(APPLICATION_WINDOW)、子窗口(SUB_WINDOW)、系统窗口(SYSTEM_WINDOW)三种类型,应用窗口z轴范围是1~99,子窗口的范围是1001~1999,系统窗口是(2000~2999),所以要实现浮动窗口我们只能在系统窗口范围中实现。

b4c23dee9206

b4c23dee9206

窗体类型

到这里我们对Android系统的窗口层次有个大致的了解了,Activity是Android应用的四大组件之一,描述的是应用的活动状态和周期,受ActivityManagerService的管理;Window/View是图形窗口的抽象模型,描述的是窗口的绘制信息,受WindowManagerService的管理;Activity聚合Window来和图形窗口产生联系。文章旨在理解一下Android窗体系统的一个雏形,能力有限不能详细跟踪整个窗口体系的源码,有兴趣的可以自己深入,下一篇文章:《越过授权使用浮窗》。

DMEO

作者声明:本人只在简书和本人博客中发表文章,转载需联系本人取得同意!读者阅读时若出现排版混乱、广告等影响阅读体验说明不是原文,建议到简书或本人博客中阅读原文以取得更好的阅读体验。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_31463675/article/details/117543529

智能推荐

自制社交门户网站的用户等级表_xosg的博客-程序员宅基地

等级 称号 所需经验值 总经验 0 出生平民1.0 0 0 1 出生平民2.0 1 1 2 出生平民3.0 4 5 3 幼儿园托班I 9 14 4 幼儿园托班II 16 30 5 幼儿园托班III 25 55 6 幼儿园小班I

(升级)分库分表下的事务、数据脱敏及配置管理_gonghaiyu的博客-程序员宅基地

如何使用强一致性事务与柔性事务分布式环境下,事务就会变得比较复杂。这在分布式事务章节会进行详细分析。本章节只是针对ShardingShere中的分布式事务处理方案。ShardingSphere 中的分布式事务在 ShardingSphere 中,除本地事务之外,还提供针对分布式事务的两种实现方案,分别是 XA 事务和柔性事务。这点可以从事务类型枚举值 TransactionType 中得到验证:public enum TransactionType { LOCAL, XA, BASE}

Lisp语言基础_冰霜行者6的博客-程序员宅基地_lisp语言

LispLisp是一款语法很简单,应用却很广的语言。它适用于符号处理、自动推理、硬件描述和超大规模集成电路设计等。它是最有影响的人工智能语言。在介绍Lisp语言之前,先要说一说什么是广义表。广义表(generalized list) 是一种非线性的数据结构,是线性表的一种推广。在广义表中,每个元素可以是一个值,即原子(atom),或者是一个子表。广义表(a,b,(c,d),e)(a,b,(c...

以UTF-8编码方式讲数据存储的编码_golden_dreams的博客-程序员宅基地

UNICODE编码详解之UTF-8 , UTF-16,UTF-32      名词解释:  Unicode只是一个简单的标准,用来把字符映射到数字上,Unicode并不告诉你字符是怎么编码成字节的。这是被编码方案决定的,通过UTF来指定。      文本数据在计算机底层的表示:                在计算机的硬盘,内存(等可以存储计算机数据的设备间)上数据都是以0和1表示

关于emgucv的书_第三章 EmguCV入门指南-中文翻译版.pdf_weixin_39965161的博客-程序员宅基地

EmguCV 入门指南翻译:gola E-mail :[email protected] 封装OPENCV 2函数映射– EMGU.CV.CV INVOKE 2结构映射 EMGU.CV.STRUCTURE .MXXX 2枚举常量映射 EMGU.CV.CV ENUM 22.托管类3IMAGES 如何使用3Depth 和Color 作为泛型参数3创建图像3自动垃...

浅谈浏览器架构、单线程js、事件循环、消息队列、宏任务和微任务_趁你还年轻233的博客-程序员宅基地

关键词:多进程、单线程、事件循环、消息队列、宏任务、微任务看到这些词仿佛比较让人摸不着头脑,其实在我们的日常开发中,早就和他们打过交道了。我来举几个常见的例子:我执行了一段js,页面就卡了挺久才有响应我触发了一个按钮的click事件,click事件处理器做出了响应我用setTimeout(callback, 1000)给代码加了1s的延时,1秒里发生了很多事情,然后功能正常了我用setInterval(callback, 100)给代码加了100ms的时间轮训,直到期待的那个变量出现再执行后.

随便推点

DDD 领域驱动设计实战(分层架构)_公众号-芋道源码的博客-程序员宅基地

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 8:55 更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2020 超神之路,很肝~中...

使用Python中os读取含特殊字符路径的简单办法_平仄_csdn的博客-程序员宅基地

使用python的os库读取文件路径时,有时会遇到文件名包含特殊字符的情况,导致读取到的路径与实际路径不一致。比如文件--- -Ì-¼-æ100-N.jpg,直接读取为J:\\Japan's poster2\\---?-\xa8\xac-?-?100-N.jpg。这是因为os库的默认文字编码格式非Unicode导致的。解决的办法很简单,定义路径时定义为Unicode。如os.walk(u'./adi

使用 WebSocket 打造网页 IM 聊天,看不懂就锤爆艿艿的狗头~_公众号-芋道源码的博客-程序员宅基地

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 8:55 更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2020 超神之路,很肝~...

通过SimpleAdapter直接在ListView中显示图片_薇洛的打火机的博客-程序员宅基地

最近在做一个界面,想法是把一个目录中的图片显示在一个GridView控件中,做成类似缩略图的效果。我们知道GridView和ListView都是AbsListView的子类。实现GridView和ListView最关键的步骤就是给它们设定Adapter。一般有三种方法:用ArrayAdapter,用SimpleAdapter,或者自定义一个BaseAdapter的子类。由于

吴恩达 EM算法翻译 混合高斯的EM求解_AnthongDai的博客-程序员宅基地

原文博客 http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html

我的机器学习-part(2020-1)【有监督/无监督、Spark+BigDL】_滚滚的纸盒子的博客-程序员宅基地

回望过去+看未来1.过去经历1.1 问题抽象1.2 特征工程2.强化学习1.过去经历个人理解,抛砖引玉,另外为了通俗,难免不严谨,会其意。大致分为有监督学习(如回归、分类)、无监督学习(如聚类、降维)、强化学习这3支,强化学习我暂时还没有亲身去玩,就不乱说,后续补上。首先,回归和分类其实一个问题,比如预测房价0~100000的某一个数值,你把房价切成几个区间,预测在哪个区间,就实现了回归和分类的转化。然后,实际中大部分问题是一个分类/回归问题,拿分类举例,你现在要对某产品的user进行使用目的分类

推荐文章

热门文章

相关标签