Android之Window与WindowManager窗口管理

本文详细探讨了Android中的Window与WindowManager的基本概念,包括Window的创建时机、添加View到WindowManager的过程,以及Activity、Dialog如何与WindowManager交互。Window作为一个抽象概念,以View形式存在,而WindowManager负责窗口的管理,通过ViewRootImpl与WindowSession通信,实现窗口的添加、删除和更新。此外,文章还阐述了Dialog和Activity添加到WindowManager的具体步骤。
摘要由CSDN通过智能技术生成

1.Window与WindowManager基本概念

  • Window、PhoneWindow

顶层窗口样式和行为的抽象类,概括了Android窗口的基本属性和功能。该类实例的getDecorView()方法返回的DecorView被用于作为顶层视图添加到WM中;

创建时机:ActivityThread.handleLaunchActivity--->ActivityThread.performLaunchActivity--->Activity.attach

  • WindowManager,WindowMangerImpl,WindowMangerGlobal

WindowManger与一个特定的Display相关联,Display类提供关于屏幕尺寸和分辨率的信息;

  • WindowManagerService

对系统中的所有窗口进行管理,WindowManger是运行在Application process中的,WindowMangerService是在system_server进行中运行,两者的通信是通过中间的会话层IWindowSession来进行的;

2.添加View到WindowManager过程

final WindowManager wM = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
                wM.getCurrentWindowMetrics().getBounds().width(), wM.getCurrentWindowMetrics().getBounds().height()
        );
        layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION;
        layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        layoutParams.format = PixelFormat.TRANSLUCENT;
        wM.addView(maskView, lp);

相关类的简化结构

public class PhoneWindow extends Window implements MenuBuilder.Callback {
        //窗口顶层的视图
        private DecorView mDecor;
}
//添加和移除到Activity上视图的接口,通过Context.getSystemService()获取实例
public interface ViewManager {     
        /**         
        * @param view 被添加到Window的视图      
        * @param params 添加View的布局参数      */     
        public void addView(View view, ViewGroup.LayoutParams params);     
        public void updateViewLayout(View view, ViewGroup.LayoutParams params);   
        public void removeView(View view); 
}
@SystemService(Context.WINDOW_SERVICE)
public interface WindowManager extends ViewManager{
       public static class LayoutParams extends ViewGroup.LayoutParams implements Parcelable {
        //添加的View在window上x坐标
        public int x;
        //添加的View在window上y坐标
        public int y;
        //添加视图所属窗口类型,应用窗口(1-99),子窗
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值