android 浮窗示例代码,Android 浮窗开发之窗口层级(示例代码)
很多人都知道如何去实现一个简单的浮窗,但是却很少有人去深入的研究背后的流程机制,由于项目中浮窗交互比较复杂,遇到了些坑查看了很多资料,故总结浮窗涉及到的知识点:
窗口层级关系(浮窗是如何“浮”的)?
浮窗有哪些限制,如何越过用户授权实现浮窗功能?
窗口与用户输入系统(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的关系:
再来window和View的关系:
Activity窗口显示过程:
说Activity是怎么显示出来的,其实是说Activity管理的View是怎么显示出来的。最后再来总结一下:
一、Activity通过setContentView设置的视图是添加到PhoneWindow的根视图decor中。
二、Window是一个抽象的概念,Window关了了一个View(根视图),最终被WindowManager管理的还是一个View(根视图)和它的LayoutParams,视图绘制刷新都是通过WindowManager(WindowManagerGlobal)与WindowManagerServiceIPC交互调用底层绘制的。
三、Activity是四大组件中唯一和窗体紧密联系的组件(这是为什么会有初学者把Activity直接理解为绘制界面的原因),所有掌管的视图只不过是一种window和Dialog、Toast、墙纸所掌管的Window类型不一样。
浮窗为什么会“浮”?
上面讲到Activity的显示过程其实已经揭示了通用界面的显示过程,浮窗的显示过程更为简单:
做过浮窗的同学应该都明白了,为啥浮窗能脱离Activity而显示,本质上我们是把一个View交给WindowManager来管理了,LayoutParams.type类型决定了这个View显示窗口的类型,不同类型显示的窗口层次(z轴)是不一样的。大方面来讲可以分为应用窗口(APPLICATION_WINDOW)、子窗口(SUB_WINDOW)、系统窗口(SYSTEM_WINDOW)三种类型,应用窗口z轴范围是1~99,子窗口的范围是1001~1999,系统窗口是(2000~2999),所以要实现浮动窗口我们只能在系统窗口范围中实现。
类型
常量范围
子类
常量值
说明
例子
APPLICATION_WINDOW
1~99
TYPE_BASE_APPLICATION
1
TYPE_APPLICATION
2
应用窗口
大部分的应用程序窗口
TYPE_APPLICATION_STARTING
3
应用程序的Activity显示之前由系统显示的窗口
LAST_APPLICATION_WINDOW
99
SUB_WINDOW
1000~1999
FIRST_SUB_WINDOW
1000
TYPE_APPLICATION_PANEL
1000
显示在母窗口之上,遮挡其下面的应用窗口。
TYPE_APPLICATION_MEDIA
1001
显示在母窗口之下,如果应用窗口不挖洞,即不可见。
SurfaceView,在小窗口显示时设为MEDIA, 全屏显示时设为PANEL
TYPE_APPLICATION_SUB_PANEL
1002
TYPE_APPLICATION_ATTACHED_DIALOG
1003
TYPE_APPLICATION_MEIDA_OVERLAY
1004
用于两个SurfaceView的合成,如果设为MEDIA,则上面的SurfaceView 挡住下面的SurfaceView
SYSTEM_WINDOW
2000~2999
TYPE_STATUS_BAR
2000
顶部的状态栏
TYPE_SEARCH_BAR
2001
搜索窗口,系统中只能有一个搜索窗口
TYPE_PHONE
2002
电话窗口
TYPE_SYSTEM_ALERT
2003
警告窗口,在所有其他窗口之上显示
电量不足提醒窗口
TYPE_KEYGUARD
2004
锁屏界面
TYPE_TOAST
2005
短时的文字提醒小窗口
TYPE_SYSTEM_OVERLAY
2006
没有焦点的浮动窗口
TYPE_PRIORITY_PHONE
2007
紧急电话窗口,可以显示在屏保之上
TYPE_SYSTEM_DIALOG
2008
系统信息弹出窗口
比如SIM插上后弹出的运营商信息窗口
TYPE_KEYGUARD_DIALOG
2009
跟KeyGuard绑定的弹出对话框
锁屏时的滑动解锁窗口
TYPE_SYSTEM_ERROR
2010
系统错误提示窗口
ANR 窗口
TYPE_INPUT_METHOD
2011
输入法窗口,会挤占当前应用的空间
TYPE_INPUT_METHOD_DIALOG
2012
弹出的输入法窗口,不会挤占当前应用窗口空间,在其之上显示
TYPE_WALLPAPER
2013
墙纸
TYPE_STATUS_BAR_PANEL
2014
从状态条下拉的窗口
TYPE_SECURE_SYSTEM_OVERLAY
2015
只有系统用户可以创建的OVERLAY窗口
TYPE_DRAG
2016
浮动的可拖动窗口
360安全卫士的浮动精灵
TYPE_STATUS_BAR_PANEL
2017
TYPE_POINTER
2018
光标
TYPE_NAVIGATION_BAR
2019
TYPE_VOLUME_OVERLAY
2020
音量调节窗口
TYPE_BOOT_PROGRESS
2021
启动进度,在所有窗口之上
TYPE_HIDDEN_NAV_CONSUMER
2022
隐藏的导航栏
TYPE_DREAM
2023
屏保动画
TYPE_NAVIGATION_BAR_PANEL
2024
Navigation bar 弹出的窗口
比如说应用收集栏
TYPE_UNIVERSAL_BACKGROUND
2025
TYPE_DISPLAY_OVERLAY
2026
用于模拟第二显示设备
TYPE_MAGNIFICATION
2027
用于放大局部
TYPE_RECENTS_OVERLAY
2028
当前应用窗口,多用户情况下只显示在用户节目
android 浮窗示例代码,Android 浮窗开发之窗口层级(示例代码)相关推荐
- android 更改窗口的层次,浮窗开发之窗口层级
最近在项目中遇到了这样的需求:需要在特定的其他应用之上悬浮自己的UI交互(拖动.输入等复杂的UI交互),和九游的浮窗类似,不过我们的比九游的体验更好,我们越过了很多授权的限制. 浮窗效果 很多人都知道 ...
- Android 浮窗开发之窗口层级
很多人都知道如何去实现一个简单的浮窗,但是却很少有人去深入的研究背后的流程机制,由于项目中浮窗交互比较复杂,遇到了些坑查看了很多资料,故总结浮窗涉及到的知识点: 窗口层级关系(浮窗是如何"浮 ...
- android n进入分屏代码分析_Android分屏多窗口的实践代码
Android N 中推出了多窗口支持,项目要求适配多窗口模式,记录一下. 1.生命周期:对于完全没有适配多窗口的APP来说,当启用多窗口模式或者拖动窗口时,会出现Activity销毁重新加载的现象. ...
- 团队代码规范java,java 开发,适用于团队的代码规范及某些约定
包含 api 开发原则.代码风格.mapper 扩展等. api 开发总则遵循单一职责原则,一个类只做一件(类)事. 数据库表与业务类是 1:N 的关系. 简单业务表建议只有一个业务类,复杂业务表,建 ...
- vrml行走和静止的人代码_CAE二次开发的核心不是代码
作者:朱淑强来源:误入CAE的程序员微信公众号(itincae)文末试看<轮胎建模仿真与模态轮胎的生成>课程 所谓的有限元软件的二次开发工作,绝大部分指的是前后处理的二次开发,基本不涉及求 ...
- 【我的Android进阶之旅】Android自定义Lint实践
背景 2017年8月份的时候,我在公司开始推广Lint.FindBugs等静态代码检测工具.然后发现系统自带的Lint检测的Issue不满足我们团队内部的特定需求,因此去自定义了部分Lint规则.这个 ...
- android浮窗播放器,Android仿优酷视频的悬浮窗播放效果
之前接了需求要让视频播放时可以像优酷视频那样在悬浮窗里播放,并且悬浮窗和主播放页面之间要实现无缝切换,项目中使用的是自封装的ijkplayer 这个要求就代表不能在悬浮窗中新建视频控件,所以需要在悬浮 ...
- Android仿优酷视频的悬浮窗播放
Android仿优酷视频的悬浮窗播放 之前接了需求要让视频播放时可以像优酷视频那样在悬浮窗里播放,并且悬浮窗和主播放页面之间要实现无缝切换,项目中使用的是自封装的ijkplayer 这个要求就代表不能 ...
- 教你如何在Android 6.0上创建系统悬浮窗
郭霖大神的文章:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650235949&idx=1&sn=0f7eded ...
最新文章
- 设计RPC接口时,你有考虑过这些吗?
- 通过WebService调用SQLXML(SQL Server 2005) [ZT]
- v380云存储怎么用_云智中国-百度智能云薄磊:海量无限存储,助力产业智能化升级...
- 转dem_约会大作战:真那离开DEM社,欠着的500万就不用还了
- 在java中对null的理解
- 华为nova7se能云闪付吗_华为迎来转机!联发科“顶替”麒麟芯片,已售罄手机将重获新生...
- 开源 20 年,为何程序员对闭源越来越厌恶?
- 让电脑提速的小方法-----QoS数据计划程序
- c语言试讲课程,《C语言程序设计教程》试讲教案.doc
- scratch3.0发布作品生成封面图
- Java基础知识总结(超详细整理)
- 计算机分屏显示知识,如何使用Windows的分屏显示功能
- 计算机信息安全培训计划,信息安全工作计划
- SQL Server认证培训与考试
- Android插件化方式实现View动态更新
- 2022年度总结:反思与回顾
- Android Audio 2: Audio相关术语
- 程序员必知的编程4大祖师爷,C语言之父堪称编程界的牛顿!
- 在线沙盒(恶意软件行为分析工具)整理介绍
- 目标检测之R-CNN
热门文章
- 推荐一款特别厉害的在线工具,程序员的百宝箱
- 为什么用于开关电源的开关管一般用MOS管而不是三极管
- [python] python模块graphviz使用入门
- 学生专用计算机游戏怎么按,学生计算器怎么玩
- K2 BPM平台应用价值(上篇):统一的流程管理平台对企业有多重要?|工作流平台
- 【JS】导出合并表格
- html怎么设置img样式,css默认样式 css中img默认样式问题
- Windows安装Apache(解决问题Set the 'ServerName' directive globally to suppress this message)
- 最近5年133个Java面试问题列表
- html文件设置成mac屏保,如何将视频设置为Mac上的屏幕保护程序 | MOS86