1.Window&WindowManagerbash
a.Window&PhoneWindow: Window是一个抽象类,它定义了顶级窗体样式和行为。其惟一的实现类是PhoneWindow。ide
推荐阅读:Window,PhoneWindow,DecorView,setContentView源码理解布局
b.Window&View: 每一个Window都对应一个View和一个ViewRootImpl,Window和View经过ViewRootImpl来创建联系。Window并不可见,它实际以View的形式存在,它是View的直接管理者。post
c.Window&WindowManager: 实际使用中没法访问Window,对Window的访问必须经过WindowManager,对Window的操做经过它完成。学习
//将一个Button添加到屏幕为(100,300)的位置
mFloatingButton = new Button(this);
mFloatingButton.setText("test button");
mLayoutParams = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0, 0,PixelFormat.TRANSPARENT);//第三个参数表明flags,第四个参数表明type
mLayoutParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE
| LayoutParams.FLAG_SHOW_WHEN_LOCKED;//配置flags
mLayoutParams.type = LayoutParams.TYPE_SYSTEM_ERROR;//配置type
mLayoutParams.gravity = Gravity.LEFT | Gravity.TOP;//配置gravity
mLayoutParams.x = 100;//相对于gravity
mLayoutParams.y = 300;//相对于gravity
mFloatingButton.setOnTouchListener(this);
mWindowManager.addView(mFloatingButton, mLayoutParams);
复制代码
这里依次介绍WindowManager的三个重要参数:ui
- Window是分层的,见下表。
- 层级大的会覆盖在层级小的Window上面。
- 对应WindowManager.LayoutParams的type参数。
d.WindowManager&WindowManagerService: Window的具体实现位于WindowManagerService中。WindowManager和WindowManagerService的交互是一个IPC(跨进程通讯)过程。this
2.Window的内部机制spa
public interface ViewManager
{
public void addView(View view, ViewGroup.LayoutParams params);//添加过程
public void updateViewLayout(View view, ViewGroup.LayoutParams params);//更新过程
public void removeView(View view);//删除过程
}
复制代码
public interface WindowManager extends ViewManager {}
复制代码
public final class WindowManagerImpl implements WindowManager{
@Override
public void addView(View view, ViewGroup.LayoutParams params){
mGlobal.addView(view, params, mDisplay, mParentWindow);
}
@Override
public void updateViewLayout(View view, ViewGroup.LayoutParams params){
mGlobal.updateViewLayout(view, params);
}
@Override
public void removeView(View view){
mGlobal.removeView(view, false);
}
}
复制代码
private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();
复制代码
一幅图说明这几个类的关系:.net
所以,经过WindowManagerGlobal的addView()、updateViewLayout()、removeView()实现WindowManager对Window的添加、删除和修改。线程
下面分别来看WindowManagerGlobal对Window操做的大体过程:
a.Window的添加过程:
b.Window的删除过程
c.Window的更新过程
不难发现, 以上验证了以前的总结:
- Windows的三大操做最终都会经过一个IPC过程移交给WindowManagerService。
- Window和View经过ViewRootImpl来联系,ViewRootImpl可控制View的测量、布局和重绘。
推荐阅读:源码剖析之------Window的内部实现机制、我眼中的Window建立/添加/删除/更新过程
3.Window的建立过程
因为View必须依附Window才能呈现出来,所以有View的地方必有Window。在Android中能够提供View的地方有Activity、Dialog和Toast,下面分别来看以上三种Window的大体建立过程:
a.Activity的Window建立过程
推荐阅读:Activity的Window建立过程分析(源码)
b.Dialog的Window建立过程
Step1:建立WindowDialog。和Activity相似,一样是经过PolicyManager.makeNewWindow() 来实现。
Step2:初始化DecorView并将Dialog的视图添加到DecorView中去。和Activity相似,一样是经过Window.setContentView() 来实现。
Step3:将DecorView添加到Window中显示。和Activity同样,都是在自身要出如今前台时才会将添加Window。
c.Toast的Window建立过程
①Toast的内部的视图由两种方式指定:
②Toast具备定时取消功能,故系统采用Handler作定时处理。
③在Toast内部有两类IPC过程:
④Toast提供方法show() 和cancel() 分别用于显示和隐藏Toast。
NMS只是起到了管理Toast队列及其延时的效果,Toast 的显示和隐藏实际是经过TN来实现的。
推荐阅读:Android对话框Dialog,PopupWindow,Toast的实现机制
但愿这篇文章对你有帮助~