Android内核剖析之Window内部机制
2018-03-14 10:01
260 查看
windowManager其实指示一个接口,其具体实现是在WindowManagerImpl,而WindowManagerImpl其实什么都没做,指示调用WindowManagerGlobal中的方法来实现的,WindowManagerGlobal是个单例模式,通过Win。WindowManagerGlobal.getInstance()来获取实例。
WindowManager 通过三个方法来操作Window,addView,removeView, updateViewLayout。
Window.LayoutParams的两个属性非常重要,悬浮式的Activity就是通过这flags、type 这2个属性来实现的。
flags有三种。
FLAGE_NOT_FOCUSABLE: 不获取焦点、也不接受任何事件,同时本标志还将启动FLAGE_NOT_TOUCH_MODAL,最终事件会传递给下层的事件。
FLAGE_NOT_TOUCH_MODAL:在此模式下,系统会将window窗口以外的事件传递给下层window,当前window范围内的点击事件则自己处理。
FLAGE_SHOW_LOCKED:本模式,指示本窗口可以显示在锁屏界面上。
Type有三种,应用Window(0 - 99,例如Activity),子Window(1000 - 1999,例如Dialog,Toast等)、系统Window(2000 - 2999);数值越大,越会显示在前面。例如Dialog子window会显示在其附属的Activity上面。通过WindowManager.LayoutParams.type进行设置。
Window的增加过程,即是View的增加过程,每个Window对应一个View、ViewRoot(ViewRootImpl是ViewRoot的实现),WindowManager通过addView增加一个view,其实通过调用WindowManagerGloabal中的addView;而在WindowManagerGloabal中addView方法中,其实是调用了ViewRootImpl中的addView方法。ViewRootImpl中的addView只是发送一个请求增加消息之后返回。ViewRoot继承了Handler。
悬浮式窗口的实现:
首先,悬浮式activity需要在AndroidManifest.xml中对应的activity上配置属性:
具体属性如下(具体属性需求,可以根据需求做适当变化,此方案只给出个方案参考):
做了以上的配置后,activity已经可以实现窗口悬浮式显示了,但是面对大屏显示,需要控制其的显示位置,我们该如何设置呢?可以参考以下方案:
在activity中复写以下方法实现位置控制,具体参考以下代码:
WindowManager 通过三个方法来操作Window,addView,removeView, updateViewLayout。
Window.LayoutParams的两个属性非常重要,悬浮式的Activity就是通过这flags、type 这2个属性来实现的。
flags有三种。
FLAGE_NOT_FOCUSABLE: 不获取焦点、也不接受任何事件,同时本标志还将启动FLAGE_NOT_TOUCH_MODAL,最终事件会传递给下层的事件。
FLAGE_NOT_TOUCH_MODAL:在此模式下,系统会将window窗口以外的事件传递给下层window,当前window范围内的点击事件则自己处理。
FLAGE_SHOW_LOCKED:本模式,指示本窗口可以显示在锁屏界面上。
Type有三种,应用Window(0 - 99,例如Activity),子Window(1000 - 1999,例如Dialog,Toast等)、系统Window(2000 - 2999);数值越大,越会显示在前面。例如Dialog子window会显示在其附属的Activity上面。通过WindowManager.LayoutParams.type进行设置。
Window的增加过程,即是View的增加过程,每个Window对应一个View、ViewRoot(ViewRootImpl是ViewRoot的实现),WindowManager通过addView增加一个view,其实通过调用WindowManagerGloabal中的addView;而在WindowManagerGloabal中addView方法中,其实是调用了ViewRootImpl中的addView方法。ViewRootImpl中的addView只是发送一个请求增加消息之后返回。ViewRoot继承了Handler。
悬浮式窗口的实现:
首先,悬浮式activity需要在AndroidManifest.xml中对应的activity上配置属性:
android:theme="@style/Theme.WindowActivity"
具体属性如下(具体属性需求,可以根据需求做适当变化,此方案只给出个方案参考):
<style name="Theme.WindowActivity" parent="android:style/Theme.Dialog"> <item name="android:windowNoTitle">true</item> <item name="android:windowIsTranslucent">false</item> <item name="android:backgroundDimEnabled">false</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowFrame">@null</item> <item name="android:windowFullscreen">false</item> </style>
做了以上的配置后,activity已经可以实现窗口悬浮式显示了,但是面对大屏显示,需要控制其的显示位置,我们该如何设置呢?可以参考以下方案:
在activity中复写以下方法实现位置控制,具体参考以下代码:
@Override public void onAttachedToWindow(){ View view = getWindow().getDecorView(); WindowManager.LayoutParams params = (WindowManager.LayoutParams) view .getLayoutParams(); params .gravity = Gravity.LEFT | Gravity.TOP; params .x = 60; params .y = 100; getWindowManager().updateViewLayout(view, lp); }
相关文章推荐
- android内核剖析学习笔记:AMS(ActivityManagerService)内部原理和工作机制
- android 源码剖析之------Window的内部实现机制(添加、删除、更新)
- Android Window 内部机制 补充
- Android事件分发机制源码剖析(2)—顶层View对点击事件的分发过程
- Android异步机制的几种实现方式剖析
- Android Window 机制探索
- Spark内核源码深度剖析:Master主备切换机制原理剖析与源码分析
- Linux内部的时钟处理机制全面剖析
- Android后台杀死系列之一:FragmentActivity及PhoneWindow后台杀死处理机制
- AIDL/IPC Android AIDL/IPC 进程通信机制——超详细讲解及用法案例剖析(播放器)
- android View机制深入剖析
- Android Looper And Hander 机制剖析 - 02
- Android Looper And Hander 机制剖析 - 03
- WCF技术剖析之三十三:你是否了解WCF事务框架体系内部的工作机制?[上篇]
- android内核剖析 Framework 读书笔记
- Android消息机制之Handler,MessageQueue,Looper源码剖析
- Android内核与标准Linux内核在文件系统、进程间通信机制、内存管理等方面存在不同
- Android 广播内部机制详解(二)
- Android SurfaceView运行机制详解—剖析Back与Home按键及切入后台等异常处理!
- 深入剖析Android消息机制原理