android Gui系统之WMS(1)----window flags & view flags
2016-07-23 09:21
441 查看
SurfaceFlinger 前面说的,就是一个surface的合成。SurfaceFlinger就是一个默默的记录着,它不会对surface的内容有什么改动。
WMS(WindowsManagerService)就是对surface的管理,或者说是一个大管家。它负责协调各方面资源。
ViewRoot就是一个个演员,负责表演(产生surface)。
从IO系统角度而言,WMS至少要干这几件事。
全局窗口管理
全局事件派发
键盘
触摸屏
由SystemServer负责启动
知道系统关闭才能停止
发生异常的时候,能够自我恢复
2)SurfaceFlinger 和WMS将有很多交集。
3)有显示需求的图层。可以想见,界面显示是分不同层级的。
4)inputManagerService 当有按键或者触摸事件时,WMS时最好的管理员。
5)AMS 同WMS 也有交互。
6)Bind交互
从WMS窗口的实现来讲,主要包含如下子功能
窗口的添加和删除
启动窗口
窗口动画
窗口大小
窗口层级
事件派发
提供了很多功能,包含屏幕获取,获取窗口大小,启动窗口等
1.3 WMS工作方式
WMS很复杂,以工作方式作为切入点是比较合适的。
WMS,AMS,Activity之间的关系
full
FLAG_FORCE_NOT_FULLSCREEN:同FLAG_FULLSCREEN相反
FLAG_SECURE:窗口无法被截屏。不安全的应用也无法显示等。
FLAG_SCALED:按用户的要求调整窗口
FLAG_IGNORE_CHEEK_PRESSES: 当屏幕有可能贴着脸时,这一选项可防止面颊对屏幕造成误操作。
FLAG_LAYOUT_INSET_DECOR:只能和FLAG_LAYOUT_IN_SCREEN一起使用,充分考虑各种情况
FLAG_SHOW_WHEN_LOCKED:在锁屏的时候,可以显示该页面,也是非常重要的flag。关于锁屏的问题可以参考 锁屏上显示Activity 这篇博客,此处不再叙述。
FLAG_SHOW_WALLPAPER:当前activity为透明或者半透明的时候,让壁纸作为背景。
FLAG_TURN_SCREEN_ON:把屏幕点亮
FLAG_DISMISS_KEYGUARD:解锁。是指普通锁屏,但是安全锁(图案或者密码锁屏界面)是无效的。 在电话界面,可以直接解锁,而不需进入锁屏界面。
FLAG_HARDWARE_ACCELERATED:硬件加速,具体取决于硬件条件。
3)systemUiVisibilty
这个flag,定义在View中,
这里先明确,这些flag起作用,首先这个view必须是可见的。而window的flag是全局的。
View.SYSTEM_UI_FLAG_VISIBLE:显示状态栏 View.INVISIBLE 对应属性,隐藏状态栏。
View.SYSTEM_UI_FLAG_FULLSCREEN 和上节讲到的FLAG_FULLSCREEN具有相同的效果,具体的细微差距,请参考http://www.360doc.com/content/15/0204/18/20385871_446270224.shtml 这篇文章。此处不做详细讨论。
根据经验,View可以是临时的,而FLAG_FULLSCREEN 可以是长期的。
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 可以是navigationbar隐藏。
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN activity全屏显示,但是statusbar不会隐藏,会把activity上面的部分,覆盖。
View.SYSTEM_UI_FLAG_IMMERSIVE ,在5.1上测试的结果同SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 类似,activity全屏,但statusbar仍然存在。半透明的状态,但是状态栏点击会有反映。
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 在statusbar隐藏后,过几秒会自动出现。
这里还要注意getWindow().getDecorView().setSystemUiVisibility();同setContentView(layout.activity_wall_layout);的顺序问题。
WMS(WindowsManagerService)就是对surface的管理,或者说是一个大管家。它负责协调各方面资源。
ViewRoot就是一个个演员,负责表演(产生surface)。
从IO系统角度而言,WMS至少要干这几件事。
全局窗口管理
全局事件派发
键盘
触摸屏
1.WMS综述
1)WMS将以同AMS等一样的形式,系统server的一部分。由SystemServer负责启动
知道系统关闭才能停止
发生异常的时候,能够自我恢复
2)SurfaceFlinger 和WMS将有很多交集。
3)有显示需求的图层。可以想见,界面显示是分不同层级的。
4)inputManagerService 当有按键或者触摸事件时,WMS时最好的管理员。
5)AMS 同WMS 也有交互。
6)Bind交互
从WMS窗口的实现来讲,主要包含如下子功能
窗口的添加和删除
启动窗口
窗口动画
窗口大小
窗口层级
事件派发
1.1WMS的启动
services\java\com\android\server\SystemServer.javaprivate void startOtherServices() { inputManager = new InputManagerService(context); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); traceBeginAndSlog("StartWindowManagerService"); wm = WindowManagerService.main(context, inputManager, mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL, !mFirstBoot, mOnlyCore); ServiceManager.addService(Context.WINDOW_SERVICE, wm); ServiceManager.addService(Context.INPUT_SERVICE, inputManager); }
1.2 WMS提供的服务
public class IWindowManagerImpl implements IWindowManager
提供了很多功能,包含屏幕获取,获取窗口大小,启动窗口等
1.3 WMS工作方式
WMS很复杂,以工作方式作为切入点是比较合适的。WMS,AMS,Activity之间的关系
private void full(boolean enable) { if (enable) { WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; getWindow().setAttributes(lp); getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); } else { WindowManager.LayoutParams attr = getWindow().getAttributes(); attr.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setAttributes(attr); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); } }
full
FLAG_FORCE_NOT_FULLSCREEN:同FLAG_FULLSCREEN相反
FLAG_SECURE:窗口无法被截屏。不安全的应用也无法显示等。
FLAG_SCALED:按用户的要求调整窗口
FLAG_IGNORE_CHEEK_PRESSES: 当屏幕有可能贴着脸时,这一选项可防止面颊对屏幕造成误操作。
FLAG_LAYOUT_INSET_DECOR:只能和FLAG_LAYOUT_IN_SCREEN一起使用,充分考虑各种情况
FLAG_SHOW_WHEN_LOCKED:在锁屏的时候,可以显示该页面,也是非常重要的flag。关于锁屏的问题可以参考 锁屏上显示Activity 这篇博客,此处不再叙述。
FLAG_SHOW_WALLPAPER:当前activity为透明或者半透明的时候,让壁纸作为背景。
WindowManager.LayoutParams lp=getWindow().getAttributes(); lp.alpha = 0.5f; getWindow().setAttributes(lp);//设置透明度 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER);//设置壁纸
FLAG_TURN_SCREEN_ON:把屏幕点亮
FLAG_DISMISS_KEYGUARD:解锁。是指普通锁屏,但是安全锁(图案或者密码锁屏界面)是无效的。 在电话界面,可以直接解锁,而不需进入锁屏界面。
FLAG_HARDWARE_ACCELERATED:硬件加速,具体取决于硬件条件。
3)systemUiVisibilty
这个flag,定义在View中,
这里先明确,这些flag起作用,首先这个view必须是可见的。而window的flag是全局的。
View.SYSTEM_UI_FLAG_VISIBLE:显示状态栏 View.INVISIBLE 对应属性,隐藏状态栏。
View.SYSTEM_UI_FLAG_FULLSCREEN 和上节讲到的FLAG_FULLSCREEN具有相同的效果,具体的细微差距,请参考http://www.360doc.com/content/15/0204/18/20385871_446270224.shtml 这篇文章。此处不做详细讨论。
根据经验,View可以是临时的,而FLAG_FULLSCREEN 可以是长期的。
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 可以是navigationbar隐藏。
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN activity全屏显示,但是statusbar不会隐藏,会把activity上面的部分,覆盖。
View.SYSTEM_UI_FLAG_IMMERSIVE ,在5.1上测试的结果同SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 类似,activity全屏,但statusbar仍然存在。半透明的状态,但是状态栏点击会有反映。
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 在statusbar隐藏后,过几秒会自动出现。
这里还要注意getWindow().getDecorView().setSystemUiVisibility();同setContentView(layout.activity_wall_layout);的顺序问题。
相关文章推荐
- UITableView的自定义cell方法总结
- 浅谈servlet中的request与response
- UIButton的基本属性和方法
- UIButton常用方法和属性
- 一步一步安装UEFI分区方式的windows 10 企业版
- UICollectionViewCell的四种创建方式
- UICollectionViewCell的四种创建方法
- UICollectionView的几种创建方法
- QT中实现UI部件自定义控件-通过部件提升
- GAME TIMERS: ISSUES AND SOLUTIONS.
- Why Does Qt Use Moc for Signals and Slots(QT官方的解释:GUI可以是动态的)
- ST表与二分 (CodeForces 689D-Friends and Subsequences)
- UITableView的性能优化? 滑动的时候有种卡的感觉是为什么?怎么解决?
- Basic_Android关于buildToolVersion与CompileSdkVersion
- Cannot create PoolableConnectionFactory (Communications link failure due to underlying exception 解决
- 52. N-Queens II
- JSP页面中的request.getContextPath()报错问题
- UIAlertController的使用
- 【STL记录】Containers--Deques
- [LeetCode] Wiggle Subsequence 摆动子序列