Activity、Window和View三者间的关系

原文地址:https://blog.csdn.net/chengjun77/article/details/21866523

一、如何将Activity展现在手机上

        Tips:Activity本身是没办法处理显示什么控件(view)的,是通过PhoneWindow进行显示的 , 换句话说:activity就是在造PhoneWindow,显示的那些view都交给了PhoneWindow处理显示.

1、在Activity创建时调用attach方法:
2、attach方法中会调用PolicyManager.makeNewWindow()  ,  实际工作的是IPolicy接口的makeNewWindow方法
      ①、其中创建了一个window(可以比喻为一个房子上造了一个窗户):mWindow = PolicyManager.makeNewWindow(this);
      ②、在window这个类中,才调用了setContentView(),这是最终的调用
             在Activity的setContentView方法中,实际上是调用:getWindow().setContentView(view, params);
             这里的getWindow()就是获取到一个Window对象
Tips:
       为啥attch优先于onCreate调用,就是由于在attch方法中,会创建window,有了window才能调用setContentView
3、在IPolicy的实现类中创建了PhoneWindow:
      ①、由mWindow = PolicyManager.makeNewWindow(this);,
      ②、这里的makeNewWindow(this);方法中,返回的是:return sPolicy.makeNewWindow(context);
      ③、这个sPolicy实际是一个接口,其实现类是Policy,其中只是创建了一个PhoneWindow
4、在PhoneWindow的setContentView中向ViewGroup(root)中添加了需要显示的内容
      ①、PhoneWindow是继承Window的
      ②、setContentView这个方法中,需要先判断一个mContentParent是否为空,因为在默认进来的时候,什么都没创建呢
             此时需要创建:installDecor(),DecorView是最根上的显示的
             可以通过adt中的的tools中有个hierarchyviewer.bat的工具,可以查看手机的结构
③、DecorView:是继承与FrameLayout的,作为parent存在,最初显示的
④、下次再加载的时候,mContentParent就不为空了,会将其中的所有的view移除掉,然后在通过布局填充器加载布局

二、三者关系

1、在Activity中调用attach,创建了一个Window
2、创建的window是其子类PhoneWindow,在attach中创建PhoneWindow
3、在Activity中调用setContentView(R.layout.xxx)
4、其中实际上是调用的getWindow().setContentView()
5、调用PhoneWindow中的setContentView方法
6、创建ParentView:
 作为ViewGroup的子类,实际是创建的DecorView(作为FramLayout的子类)
7、将指定的R.layout.xxx进行填充
通过布局填充器进行填充【其中的parent指的就是DecorView】
8、调用到ViewGroup
9、调用ViewGroup的removeAllView(),先将所有的view移除掉
10、添加新的view:addView()

Tips:
 ①、Activity就是在造“窗户”,即创建PhoneWindow
 ②、PhoneWindow才是进行显示view的操作,主要就是setContentView()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值