android发现之旅之ViewRootImpl,Activity,Window,DecorView之间的关系

android复杂的概念,经常会弄的人晕头转向.本篇说说ui里几个概念的关系.

1. 从activity启动流程,可以看出各个对象的关系

大家都知道,这是android ui的核心概念.收的就是界面的一个活动交互界面.用startAcvitity的方式启动.省去中间状态:

在activity的attach接口中:

5063         mWindow = PolicyManager.makeNewWindow(this); 每个activity有一个Window对象.
  5064         mWindow.setCallback(this);  设置window对象的回调是activity

  5087         mWindow.setWindowManager(   设置window对象的manager
  5088                 (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
  5089                 mToken, mComponent.flattenToString(),
  5090                 (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
  5091         if (mParent != null) {
  5092             mWindow.setContainer(mParent.getWindow());
  5093         }
  5094         mWindowManager = mWindow.getWindowManager(); 保存windowmanager

在ActivityThread的handleResumeActivity接口里:

  2796                 r.window = r.activity.getWindow();
  2797                 View decor = r.window.getDecorView(); decorview是window子类, 通过window来获取
  2798                 decor.setVisibility(View.INVISIBLE);
  2799                 ViewManager wm = a.getWindowManager();
  2800                 WindowManager.LayoutParams l = r.window.getAttributes();
  2801                 a.mDecor = decor;  给activity的mDecor赋值           

  2804                 if (a.mVisibleFromClient) {
  2805                     a.mWindowAdded = true;
  2806                     wm.addView(decor, l);  这个调用会调用到WindowManagerGlobal的addView
  2807                 }

WindowManagerGlobal的addView会

16             root = new ViewRootImpl(view.getContext(), display);
6              root.setView(view, wparams, panelParentView);

也就是说, ViewRootImpl的mView其实是DecorView.

2.   总结

每个activity有个window,window被windowmanager管理.

每个window都有decorview.

每个window都有ViewRoot.

绘制发起从ViewRoot.

事件传递发起冲ViewRoot.

绘制传递canvas, canvas来自surface.


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
android.leaked window.decorview@f475e85[portraitadactivity]” 错误是 Android 应用程序开发中一个常见的错误,它通常是由于窗口泄漏引起的。当一个 Activity 被销毁并且窗口仍然存在于内存中时,就会出现这个错误。 通常,当你在一个 Activity 中创建了一个 Dialog、PopupWindow 或者其他一些覆盖在Activity上的窗口时,如果没有及时释放这些窗口,就会导致窗口泄漏。这种泄漏会阻止系统回收这些未使用的资源,因此会引发内存泄漏问题。 要解决这个错误,可以采取以下几个步骤: 1. 确保在 Activity 销毁之前及时关闭或释放所有的 Dialog、PopupWindow 等窗口资源。 2. 在 Activity 的 onDestroy() 方法中调用 dismiss() 或者 cancel() 方法来关闭窗口。 3. 检查是否在其他地方也存在窗口泄漏的情况,并进行相应的修复。 4. 如果确定窗口泄漏是由于长时间运行的任务或线程导致的,可以考虑使用弱引用来持有窗口,以便在 Activity 销毁时能够自动释放这些资源。 5. 使用内存分析工具,如Android Studio 的内存分析器,来识别是否存在窗口泄漏问题,并进行调试和修复。 总结来说,android.leaked window.decorview@f475e85[portraitadactivity] 错误是由于窗口泄漏导致的,通过及时释放窗口资源和修复泄漏问题,可以解决此错误。定义良好的生命周期管理和使用内存分析工具是有效诊断和解决该错误的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值