笔沫

有梦为马,随处可栖

  • 主页
  • 技术
  • 随想
  • 音乐
所有文章 其他

笔沫

有梦为马,随处可栖

  • 主页
  • 技术
  • 随想
  • 音乐

Activity布局加载流程源码分析(III)

2019-06-28

在Activity布局加载流程源码分析(I)、Activity布局加载流程源码分析(II)、DecorView绘制流程源码分析与View绘制三大流程源码分析等四篇文章中,已经很详细分析了Acitivity的布局加载过程及布局的绘制过程。但在Activity布局加载流程源码分析(I) 中,对于setContentView(“资源文件”)怎么转化View的,没有细说,本篇博文主要想梳理一下这块内容(ps:面试的时候,被面试官问到,既然答不上来,所以决定对这部分知识也好好梳理一下)。

在开始分析之前,我们需要了解一些概念,如:

  • PhoneWindow: 是Window类具体实现类,Activity中布局加载逻辑主要就是在此类中完成的。
  • LayoutInflater: 是布局填充类,主要就是将我们的layout转化为View。
  • XmlPullParser: 是XML解析器,主要是解析xml文件也即layout.xml文件。

    一、源码分析

    从Activity布局加载流程源码分析(I)文中,我们知道,在Activity的onCreate()中setContentView()后,最后也是调用PhoneWindow中的setContentView()方法。源码如下:
    1
    2
    3
    4
    5
    //Activity中
    public void setContentView(int layoutResID) {
    getWindow().setContentView(layoutResID);//核心代码
    initActionBar();
    }
more >>
  • 技术
  • Android
  • Android框架源码解析

展开全文 >>

Android显示原理源码分析

2018-03-05

在博文DecorView绘制流程源码分析中,我们对Android的显示原理简单的说了一下,但没有深入。在博文中我们只知道Choreographer(舞蹈指挥者)只是post了一个操作,但后面到底怎么执行的?按啥逻辑执行的?我们都不清楚,作为一个喜欢刨根问底的程序员,是必须要分析分析的。

在开始分析之前,我们需要了解一些概念,如:

  • ViewRootImpl:是View的绘制的辅助类,所有View的绘制都离不开ViewRootImpl。
  • Choreographer:是”舞蹈指挥”者,控制同步处理输入(Input)、动画(Animation)、绘制(Draw)三个UI操作。
  • DisplayEventReceiver:是一个抽象类,主要是接收显示绘制帧的垂直脉冲vsync,从而开始绘制帧。
  • FrameDisplayEventReceiver: Choreographer的内部类,也是DisplayEventReceiver具体实现类。

一、Android的显示原理

Android的显示过程:

  • i.应用层通过执行View三大绘制流程,把数据缓存在Surface上;
  • ii.应用层通过跨进程通信机制,将数据传给系统层的SurfaceFlinger服务,SurfaceFlinger服务再通过硬件渲染到屏幕上;
  • iii.通过Android刷新机制(每隔16ms会发出VSYNC信号),刷新界面。
more >>
  • 技术
  • Android
  • Android框架源码解析

展开全文 >>

Android事件分发机制源码分析

2018-01-09

昨天我们对View绘制三大流程源码已做了深入分析,所以关于View的绘制流程,我相信大家也有了一个大致的了解(如果不了解,请回看博文)。然而对于View,还有一个知识点,也是极其重要的,那就是View的事件分发机制(也即Android事件分发机制)。所以,今天我们就来谈谈View的事件分发机制,从源码的角度,跟随Touch事件流,走一遍流程。

在开始分析之前,我们需要了解一些概念,如一次Touch事件,可能包括下面三个事件:

  • MotionEvent.ACTION_DOWN: 表示手指按下事件,一个事件的开始。
  • MotionEvent.ACTION_MOVE: 表示手指移动事件,事件的持续移动。
  • MotionEvent.ACTION_UP: 表示手指抬起事件,一个事件的结束。

一、View事件分发流程图

在具体分析之前,我们先来看一下事件分发流程图,以便我们更好的理解内容。图如下

more >>
  • 技术
  • Android
  • Android框架源码解析

展开全文 >>

View绘制三大流程源码分析

2018-01-08

在上篇博文DecorView绘制流程源码分析中,关于DecorView作为Activity、Window中的顶级View的绘制,我们已经作了一个详细的分析。但在具体说到View的绘制的时候,我们没有详细说明,所以本篇博文将会对View的绘制原理作深度分析。

在开始分析之前,我们需要了解一些概念,如:

  • View:是所有UI组件的基类,是Android平台中用户界面体现的基础单位。
  • ViewGroup:是容纳UI组件的容器,它本身也是View的子类。
  • ViewRootImpl:是View的绘制的辅助类,所有View的绘制都离不开ViewRootImpl。
  • MeasureSpec: View的内部类,主要就是View测量模式的工具类

一、View绘制三大流程分析

在DecorView的具体绘制中,我们涉及了View绘制的三大流程,具体分别为measure(测量)、layout(布局)和draw(绘制)。下面我们就来一一分析:
more >>

  • 技术
  • Android
  • Android框架源码解析

展开全文 >>

DecorView绘制流程源码分析

2018-01-05

通过Activiyt布局加载流程源码分析(I)和Activiyt布局加载流程源码分析(II)两篇博文,我们知道,首先,Activity的布局内容被加载进入装饰器DecorView中,然后WindowManager将DecorView添加到PhoneWindow中,也即Window中,最后ViewRootImpl对DecorView进行绘制操作,将其内容显示到手机上。但前两篇博文中,对于DecorView的绘制原理,没有作详细说明,所以本篇博文重在梳理这部分逻辑。

在开始分析之前,我们需要了解一些概念,如:

  • DecorView:是PhoneWindow中的一个内部类,也是Window的顶级View,主要负责装载各种View和Activity布局。
  • ViewRootImpl:是View的绘制的辅助类,所有View的绘制都离不开ViewRootImpl。
  • Choreographer:是”舞蹈指挥”者,控制同步处理输入(Input)、动画(Animation)、绘制(Draw)三个UI操作。
  • DisplayEventReceiver:是一个抽象类,主要是接收显示绘制帧的垂直脉冲vsync,从而开始绘制帧。
  • FrameDisplayEventReceiver: Choreographer的内部类,也是DisplayEventReceiver具体实现类。

在说DecorView的绘制之前,我们先来说说Android的绘制原理,这样方便我们理解后面内容。

一、Android的绘制原理简介

Android系统每隔16ms会发出VSYNC信号重绘我们的界面(Activity)。为什么是16ms, 因为Android设定的刷新率是60FPS(Frame Per Second), 也就是每秒60帧的刷新率, 约合16ms刷新一次。如下图所示:
more >>

  • 技术
  • Android
  • Android框架源码解析
  • DecorView绘制流程

展开全文 >>

Activity布局加载流程源码分析(II)

2018-01-03

在Activity布局加载流程源码分析(I)文章中,已经详细分析了setContentView()加载流程,但对于装饰器DecorView怎么被加载到Window上的,上篇博文没有说到,所以本篇博文将会接着上篇博文,继续分析Activity布局的加载流程。

在开始分析之前,我们需要了解一些概念,如:

  • Window: 是一个抽象类,表示是一个窗口。Android系统中的界面,也都是以窗口的形式存在的。
  • PhoneWindow: 是Window类具体实现类,Activity中布局加载逻辑主要就是在此类中完成的。
  • DecorView:是PhoneWindow中的一个内部类,也是Window的顶级View,主要负责装载各种View。
  • WindowManager: 是Window的管理类,管理着Window的添加、更新和删除。
  • WindowManagerService(AMS):是系统窗口管理服务类,具体管理着系统各种各样的Window。
  • ViewRootImpl:是View的绘制的辅助类,所有View的绘制都离不开ViewRootImpl。

一、Activity布局及DecorView加载分析

这里,我们接着Activity布局加载流程继续分析。在布局加载流程最后,主要是通过WindowManager添加装饰器DecorView到Window中,从而实现Activity布局的加载,这里继续来看那部分代码
more >>

  • 技术
  • Android
  • Android框架源码解析

展开全文 >>

Activity布局加载流程源码分析(I)

2017-12-29

最近阅读Android源码,似乎有点发现新大陆的感觉。以前经常接触Android知识,在阅读源码中,开始变得豁然开朗。前两天才写完两篇博文Activity启动流程源码分析(应用中)和Activity启动流程源码分析(Launcher中),今天,就急不可耐的想写写Activity布局加载流程,其实,也就是想趁热打铁,好好梳理梳理这部分知识。

在开始梳理之前,我们需要了解一些概念,如:

  • Window: 是一个抽象类,表示是一个窗口。Android系统中的界面,也都是以窗口的形式存在的。
  • PhoneWindow: 是Window类具体实现类,Activity中布局加载逻辑主要就是在此类中完成的。
  • WindowManager: 是Window的管理类,管理着Window的添加、更新和删除。
  • WindowManagerService(AMS):是系统窗口管理服务类,具体管理着系统各种各样的Window.
  • DecorView:是Window的顶级View,主要负责装载各种View。

一、Activity布局加载分析

我们知道,设置Activity布局内容,主要是在Activity的onCreate()中调用setContentView()方法,下面让我们来看看此方法

1
2
3
4
5
public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);//核心代码
initActionBar();
}

more >>
  • 技术
  • Android
  • Android框架源码解析

展开全文 >>

Activity启动流程源码分析(Launcher中)

2017-12-27

Activity的启动方式,严格来说有两种形式。第一种是在Android应用中启动,第二种是从Launcher中点击应用快捷图标启动。Android应用中Activity启动流程,在上篇博文Activity启动流程源码分析(应用中)已介绍过了,想了解的同学,可以看看一下。本篇博文将会介绍从Launcher中启动Activity具体流程。

在开始介绍之前,我们需要了解一些概念,如:

  • ActivityThread: 应用的启动入口类,当应用启动,会首先执行其main方法,开启主线程消息循环机制。
  • ApplicationThread: ActivityThread的内部类,主要与系统进程AMS通信,从而对应用进程的具体Activity操作进行管理。
  • Instrumentation: ActivityThread的属性变量,主要辅助ActivityThread类调用Activity的生命周期相关方法。
  • ActivityManagerService(AMS): Activity管理系统服务类,主要是对所有的Activity进行管理。
  • ActivityStack: Activity任务栈,AMS的属性变量,AMS中Activtiy的实际管理者。

一、什么是Launcher?

通俗的来说,就是我们正常解锁后,进入的第一个界面,即桌面(HomeScreen)。Launcher本身就是一个app,它主要作用是用来显示widget和管理手机上其他应用软件app。通过查看源码,我们知道Android系统会内置一些系统应用,如Launcher,联系人、照相机等,并且在Android系统启动后,会自动启动Launcher,让用户可以通过Launcher启动其他应用。

more >>
  • 技术
  • Android
  • Android框架源码解析
  • Activity启动流程

展开全文 >>

Activity启动流程源码分析(应用中)

2017-12-26

在移动应用开发中,Android四大组件之一Activity是最常用的。很多界面,如:闪屏、主界面、次功能界面等都需要Activity来作为主要的载体;界面与界面之间,即不同的Activity之间也都存在跳转切换,弄懂这其中跳转切换原理,将有助于我们更好的理解Android中Activity之间的交互逻辑,从而更好的开发Android应用。本篇博文将会重点介绍Android应用中的Activity的启动流程。

在开始介绍之前,我们需要了解一些概念,如:

  • ActivityThread: 应用的启动入口类,当应用启动,会首先执行其main方法,开启主线程消息循环机制。
  • ApplicationThread: ActivityThread的内部类,主要与系统进程AMS通信,从而对应用进程的具体Activity操作进行管理。
  • Instrumentation: ActivityThread的属性变量,主要辅助ActivityThread类调用Activity的生命周期相关方法。
  • ActivityManagerService(AMS): Activity管理系统服务类,主要是对所有的Activity进行管理。
  • ActivityStack: Activity任务栈,AMS的属性变量,AMS中Activtiy的实际管理者。

一、Activity启动流程

Activity启动流程图:
more >>

  • 技术
  • Android
  • Android框架源码解析
  • Activity启动流程

展开全文 >>

Android跨进程通信方式(IPC)解析

2017-12-15

在Android的圈子里,一直有一个声音,那就是:要学会看Android源码。在前期,android开发者比较缺乏阶段,似乎大家也没那么重视,但随着时间的发展,Android开发者早已供大于求,需要具备的技能也不在仅限于应用开发,还需要对Android运行机制原理有一个深度的了解,从而更好的为项目服务。所以,阅读Android源码,也就成为Android开发人员必须要做的事。

在阅读Android源码时,我们发现,Android系统中跨进程通信主要就是Binder。关于Binder跨进程通信原理,我已写过一篇文章Binder通信机制原理解析,想了解的同学可以看一下。其中也有说到为什么Andorid系统跨进程通信要使用Binder。在Android系统中多数服务如ActivitManagerService,WindowManagerService,PackageManagerService等都是通过Binder进行通信的,在阅读源码时,我们会时时与其打交道,所以本篇博文主要是想梳理一下Andorid源码中常见的Binder跨进程通信的方式,以便自己在读源码时,可以更好的理解。

在Binder通信机制原理解析博文中,我们说到Binder跨进程通信方式有两种,分别为AIDL方式、注册服务方式。AIDL方式在开发中是我们经常使用的方式,这里将会采用对比的方式来解析系统服务的Binder跨进程通信。

一、常用AIDL方式

1.aidl接口创建

以aidl为后缀创建一个接口类。如

1
2
3
4
interface IMainService {
void start(String temp);
}

more >>
  • 技术
  • Android
  • Android框架源码解析

展开全文 >>

123…5Next »
© 2019 笔沫
Hexo Theme Yilia by Litten
  • 所有文章
  • 其他

tag:

  • 技术
  • Android
  • Activity的启动模式
  • Android注解
  • Java反射机制
  • Java动态代理
  • Android基础
  • MVP
  • NDK
  • JNI C/C++
  • 开源框架
  • AS Gradle优化
  • 博客搭建
  • 设计模式
  • Fragment
  • Rxjava
  • Rxandroid
  • 响应式编程
  • 随想
  • 你本是一个肉体,是什么驱使你前行
  • 原创
  • 笔沫拾光
  • Java
  • Java基础
  • 王阳明心学
  • 中国历史
  • 人生的意义
  • 演讲
  • 执着的人是幸福的
  • 郭川
  • Android框架源码解析
  • 加解密算法
  • Binder通信机制
  • 开源框架源码解析
  • LeakCanary框架源码分析
  • Java集合类
  • 转载
  • Http文件断点续传
  • Logger框架源码解析
  • Android应用程序入口源码解析
  • DecorView绘制流程
  • Android消息机制源码解析
  • Activity启动流程
  • Butterknife框架源码解析
  • 我之存在,因为有你
  • 霍华德*舒尔茨
  • Android相机
  • Camera
  • 悬浮窗
  • WindowManager

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 风光摄影
  • 星空摄影
  • 人像摄影
  • 学习站点