Android解析WindowManagerService(三)Window的删除过程

本文详细介绍了Android中Window的删除过程,从WindowManagerGlobal的removeView方法开始,逐步剖析了ViewRootImpl、InputMethodManager、Session和WindowState等在删除过程中的作用,涉及窗口状态检查、线程安全、资源清理等关键步骤。
摘要由CSDN通过智能技术生成

本文首发于微信公众号「刘望舒」

关联系列
Android系统启动系列
Android深入四大组件系列
Android应用进程启动过程系列
Android解析WindowManager系列

前言

在本系列文章中,我提到过:Window的操作分为两大部分,一部分是WindowManager处理部分,另一部分是WMS处理部分,Window的删除过程也不例外,本篇文章会介绍Window的删除过程,包括了两大处理部分的内容。

Window的删除过程

Android解析WindowManagerService(二)WMS的重要成员和Window的添加过程这篇文章中Window的创建和更新过程类似,要删除Window需要先调用WindowManagerImpl的removeView方法,removeView方法中又会调用WindowManagerGlobal的removeView方法,我们就从这里开始讲起。为了表述的更易于理解,本文将要删除的Window(View)简称为V。WindowManagerGlobal的removeView方法如下所示。

frameworks/base/core/java/android/view/WindowManagerGlobal.java

  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);//1
            View curView = mRoots.get(index).getView();
            removeViewLocked(index, immediate);//2
            if (curView == view) {
   
                return;
            }
            throw new IllegalStateException("Calling with view " + view
                    + " but the ViewAncestor is attached to " + curView);
        }
    }

注释1处找到要V在View列表中的索引,在注释2处调用了removeViewLocked方法并将这个索引传进去,如下所示。
frameworks/base/core/java/android/view/WindowManagerGlobal.java

 private void removeViewLocked(int index, boolean immediate) {
   
        ViewRootImpl root = mRoots.get(index);//1
        View view = root.getView();
        if (view != null) {
   
            InputMethodManager imm = InputMethodManager.getInstance();//2
            if (imm != null) {
   
                imm.windowDismissed(mViews.get(index).getWindowToken())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值