钱柜娱乐开户 开发之漫漫长途 Ⅲ—Activity 的显示之 Window和View(2)

转载 2017年12月15日 00:00:00

?wxfrom=5&wx_lazy=1

作者 | 忘了12138
地址 | http://www.cnblogs.com/wangle12138/p/7814840.html
声明 | 本文是 忘了12138 原创,已获授权发布,未经原作者允许请勿转载

该文章是一个系列文章,是本人在钱柜娱乐开户开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《钱柜娱乐开户开发艺术探索》以及《深入理解钱柜娱乐开户 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!另外,本系列文章知识可能需要有一定钱柜娱乐开户开发基础和项目经验的同学才能更好理解,也就是说该系列文章面向的是钱柜娱乐开户中高级开发工程师。


第三篇了,,接着上一篇说 (怎么感觉没人评论呢)
上一篇我们只上图了没有具体分析,,下面干货来了


先分析setContentView(虽然这个网上一搜到处都是,不过我的不一样哦)

还是先上代码
activity_main.xml(没变哦)

<?xml version="1.0" encoding="utf-8"?>
<钱柜娱乐开户.support.constraint.ConstraintLayout
   xmlns:钱柜娱乐开户="http://schemas.钱柜娱乐开户.com/apk/res/钱柜娱乐开户"
   xmlns:tools="http://schemas.钱柜娱乐开户.com/tools"
   xmlns:app="http://schemas.钱柜娱乐开户.com/apk/res-auto"
   钱柜娱乐开户:layout_width="match_parent"
   钱柜娱乐开户:layout_height="match_parent"
   tools:context="com.helloword.MainActivity">

   <TextView
       钱柜娱乐开户:layout_width="wrap_content"
       钱柜娱乐开户:layout_height="wrap_content"
       钱柜娱乐开户:text="Hello World!"
       app:layout_constraintBottom_toBottomOf="parent"
       app:layout_constraintLeft_toLeftOf="parent"
       app:layout_constraintRight_toRightOf="parent"
       app:layout_constraintTop_toTopOf="parent" />

</钱柜娱乐开户.support.constraint.ConstraintLayout>

MainActivity.java(变了哦)

package com.helloword;
import 钱柜娱乐开户.support.v7.app.AppCompatActivity;
import 钱柜娱乐开户.os.Bundle;
public class MainActivity extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       //注意我们先注释掉该句
       //setContentView(R.layout.activity_main);
   }
}

不是要分析setContentView(R.layout.activity_main)为什么注释掉呢,,先别急,我们先运行一下,居然没有崩溃,只是得到一个空白内容页面(这个显示跟Activity Theme主题设置相关,我的是默认Theme)如下

?

我们来看一下View层级图

?

需要注意的地方我用红色框框圈住了,可以看到我们在没有写setContentView(R.layout.activity_main)的时候,程序依然可以正常运行,并显示出Title。而且结合上一篇中

?

这个图的话,我们发现除了红色区域没有,其他区域的都有。那么该Activity的显示的基础——PhoneWindow和顶级View——DecorView是什么时候创建的呢?
其实该系列的第一篇就提到了一些,在第一篇钱柜娱乐开户开发之漫漫长途 Ⅰ——钱柜娱乐开户系统的创世之初以及Activity的生命周期 的最后我们就提到了Activity的创建工作是在钱柜娱乐开户.app.ActivityThread的main函数中完成的。那么我们来分析一下该函数(我们不具体分析源码,太多了),不过我会上图

?

好了,接着把//setContentView(R.layout.activitymain);//去掉。又得到我们熟悉的HelloWorld界面,这个界面的层级图上一篇文章钱柜娱乐开户开发之漫漫长途 Ⅱ——Activity的显示之Window和View(1)已经上过了这里我们重新上传一下更详细的。这次我们再来看一下这个层级图是不是理解的更清晰了呢。我们的setContentView(R.layout.activitymain);内部把activity_main.xml文件解析成View,并把该View添加到contentView

?

注:调用setContentView(R.layout.activitymain)和不调用生成DecorView的逻辑是不一样的,如果调用了该函数会在该函数内部判断生成DecorView,如果不调用的话会在handleResumeActivity的时候判断生成这就是我们不写setContentView(R.layout.activitymain),也会生成DecorView的原因


再分析上一篇中的我们Acitivty代码

package com.helloword;
import 钱柜娱乐开户.support.v7.app.AppCompatActivity;
import 钱柜娱乐开户.os.Bundle;
public class MainActivity extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       /**
        * 可以看到我们熟悉的setContentView(R.layout.activity_main)调用没有了,
        *而是采用了下面的代码,运行然后居然得到了和setContentView(R.layout.activity_main)
        *的一样的显示结果,难道说setContentView(R.layout.activity_main)
        * 逻辑这么简单吗?我的回答是否定的,setContentView(R.layout.activity_main)
        *逻辑并没有那么简单,不信的话你点击返回按钮试试看。(无法操作了哦,不是你们的手机是不是这样,反正我的手机点击返回没有作用,重写onBackPressed方法也没有调用)
        *
        * (注:我以下面这种方式得到了和setContentView(R.layout.activity_main)一样的显示效果
        *,可这只是为了分析方便,不要模仿哦    )
        */

       //① 解析.activity_main.xml文件并创建View并且指定其父View为null(即没有父View)
       View view = getLayoutInflater().inflate(R.layout.activity_main,null);
       //② 设置显示参数
       WindowManager.LayoutParams params = new WindowManager.LayoutParams(
               WindowManager.LayoutParams.MATCH_PARENT,
               WindowManager.LayoutParams.MATCH_PARENT,
               1,
               0,
               PixelFormat.TRANSPARENT);
       //③ 添加View
       getWindowManager().addView(view,params);
   }
}

在分析之前呢,我们已经把钱柜娱乐开户 Studio 3.0自动生成的MainActivity代码差不多分析完了,相信各位读者读到这里也对Activiy的启动有了大致的了解。那为什么我们还要分析我们自己的代码呢,因为这对理解ActivityThread.main流程图的最后一步通过WindowManager添加View有巨大帮助。在我们的代码中我直接通过getLayoutInflater().inflate(R.layout.activity_main,null);把xml布局文件解析成了View,让后通过 getWindowManager().addView(view,params);添加了View。这不是跟ActivityThread.main流程图的最后一步通过WindowManager添加View不谋而合了吗。但是可以根据我们代码得到的层级图


?

可以看到我们View的层级图并没有我们熟悉的PhoneWindow以及DecorView。因为我们直接使用了WindowManager添加View,addView会新创建一个窗口,就像一个Dialog一样,并把View加入,除此之外棕色框框圈住的使我们熟悉的PhoneWindow以及DecorView。因此我十分反对上面的MainActivity写法哦。钱柜娱乐开户系统控件本身帮助我们做了很多事情,我们使用setContentView(R.layout.activity_main)之前便得到了一个PhoneWindow以及DecorView,并通过该函数把我们自己的布局View放到了DecorView下。所以理解这一点对后面的文章阅读至关重要。


?

往期

钱柜娱乐开户 开发之漫漫长途 Ⅱ——Activity的显示之Window和View(1)

钱柜娱乐开户 开发之漫漫长途Ⅰ—钱柜娱乐开户 系统的创世之初以及 Activity 的生命周期

?

【钱柜娱乐开户面试】(二):你不能不知道的view---加id和不加id的区别?

面试中被问到,钱柜娱乐开户布局中view加id和不加id的区别,你知道吗?
  • cyp331203
  • cyp331203
  • 2015年04月27日 19:10
  • 6509

使用 钱柜娱乐开户 Studio自定义View01——注意是否重写onMeasure的区别,实现真正的自适应布局

整理并总结自鸿洋的博客:/lmj623565791/article/details/24252901 一、不重写onMeasure,在res/layout/a...
  • lvyoujt
  • lvyoujt
  • 2016年06月05日 11:10
  • 824

优雅的使用RecyclerView(在一个recyclerView里显示有不同子布局的界面,就是混合不同布局)

原文 一:为了使用RecyclerView,首先在build.gradle(Module:app)文件里: 加入: dependencies { compile 'com.钱柜娱乐开户.s...
  • zzldm
  • zzldm
  • 2016年10月29日 17:30
  • 3210

在一个Activity中使用多个View (可以借鉴的一种思路)

在一个Activity中使用多个View
  • L_serein
  • L_serein
  • 2011年02月13日 20:13
  • 6014

同一个activity中通过一个按钮切换两个不同的布局

  • 2015年08月06日 22:46
  • 1MB
  • 下载

钱柜娱乐开户 Studio开发基础之自定义View组件

一般情况下,不直接使用View和ViewGroup类,而是使用使用其子类。例如要显示一张图片可以用View类的子类ImageView,开发自定义View组件可分为两个主要步骤: 一、创建一个继承自a...
  • lucky51222
  • lucky51222
  • 2015年05月19日 16:39
  • 7122

钱柜娱乐开户 利用addView 动态给Activity添加View组件

本文主要讲述如何动态给UI界面添加布局和控件,在编程的时候很多时候需要动态显示一些内容,在动态添加View的时候,主要使用addView方法。 1. addView方法简介 在Androi...
  • h183288132
  • h183288132
  • 2015年08月22日 02:06
  • 2863

钱柜娱乐开户 利用addView 动态给Activity添加View组件

本文主要讲述如何动态给UI界面添加布局和控件,在编程的时候很多时候需要动态显示一些内容,在动态添加View的时候,主要使用addView方法。 1. addView方法简介 在钱柜娱乐开户 中,可以...
  • u012881904
  • u012881904
  • 2015年09月12日 15:00
  • 9682

钱柜娱乐开户 Studio 使用RecyclerView加载不同样式布局

首先在app中引入compile 'com.钱柜娱乐开户.support:recyclerview-v7:24.2.0' 使用activity_recycler_view.xml ...
  • qq_26761229
  • qq_26761229
  • 2016年09月21日 19:10
  • 1908

浅谈Activity中setContentView()

引言 找入口 PhoneWindow类中相关代码解读 installDecor generateLayout 总结一下引言今天来研究一下钱柜娱乐开户中setContentView()方法的具体实现。...
  • wenwen091100304
  • wenwen091100304
  • 2015年10月23日 21:31
  • 5006
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:钱柜娱乐开户 开发之漫漫长途 Ⅲ—Activity 的显示之 Window和View(2)
举报原因:
原因补充:

(最多只允许输入30个字)