Android 源码解析之WindowManager删除窗口

本文深入探讨了Android系统中通过WindowManager删除窗口的源码过程。从上一篇博客的添加窗口分析开始,详细阐述了从PhoneWindow、WindowManagerImpl、ViewRootImpl到IPC调用WindowManagerService,最终在Session类中处理删除操作的流程。
摘要由CSDN通过智能技术生成

一,写在前面  

        在博客Android 源码解析之WindowManager添加窗口 中,先是介绍了如何通过WindowManager添加一个系统窗口,并从源码角度分析了PhoneWindow的创建时机,Window中创建WindowManagerImpl对象,以及创建ViewRootImpl对象,并调用setView方法完成添加窗口的操作。在ViewRootImpl类内部,通过一次IPC调用(基于Binder机制)和系统服务WindowManagerService进行通信,获取到Session对象。finally,在Session类的内部,将添加窗口的操作交给WindowManagerService处理。

二,进入主题

       本篇文章是基于窗口的添加基础上进行介绍,强烈建议阅读本篇文章的哥们,先了解WindowManager是如何添加窗口,见 Android 源码解析之WindowManager添加窗口 。因此,直接从WindomManagerImpl开始分析,WindomManagerImpl有这样两个方法都可以删除窗口。
       源码如下:
    @Override
    public void removeView(View view) {
        mGlobal.removeView(view, false);
    }

    @Override
    public void removeViewImmediate(View view) {
        mGlobal.removeView(view, true);
    }
       可以看出两个方法都调用了WindomManagerGlobal的removeView方法,只是第二个参数的boolean值不同,调用removeViewImmediate时传入true,调用removeView传入false。
       
       查看WindomManagerGlobal$removeView源码:
    public void removeView(View view, boolean immediate) {
        if (view == null) {
            throw new IllegalArgumentException("view must not be null");
        }

        synchronized (mLock) {
            int index = findViewLocked(view, true);
            View curView = mRoots.get(index).getView();
            removeViewLocked(index, immediate);
            if (curView == view) {
                return;
            }

            throw new IllegalStateException("Calling with view " + view
                    + " but the ViewAncestor is attached to " + curView);
        }
    }
       removeView最开始对参数view进行判空检查,为空则抛出异常。为避免多线程同时删除一个View,在同步代码块中处理删除窗口的操作,继续分析代码块中内容。
       其中,WindomManagerGlobal$findViewLocked源码如下:
    private int findViewLocked(View view
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值