Android系统源码分析--View绘制流程之-inflate
上一章我们分析了Activity启动的时候调用setContentView加载布局的过程,但是分析过程中我们留了两个悬念,一个是将资源文件中的layout中xml布局文件通过inflate加载到Activity中的过程,另一个是开始测量、布局和绘制的过程,第二个我们放到measure过程中分析,这一篇先分析第一个inflate过程。
Android系统源码分析–View绘制流程之-setContentView
Android系统源码分析–View绘制流程之-inflate
Android系统源码分析–View绘制流程之-onMeasure
Android系统源码分析–View绘制流程之-onLayout
Android系统源码分析–View绘制流程之-onDraw
Android系统源码分析–View绘制流程之-硬件加速
Android系统源码分析–View绘制流程之-addView
Android系统源码分析–View绘制流程之-弹性效果
LayoutInflater.inflate方法基本上每个开发者都用过,也有很多开发者了解过它的两个方法的区别,也有一些开发者去研究过 ...
Android系统源码分析--View绘制流程之-setContentView
上一篇分析了四大组件之ContentProvider,这也是四大组件最后一个。因此,从这篇开始我们分析新的篇章–View绘制流程,View绘制流程在Android开发中占有非常重要的位置,只要有视图的显示,都离不开View的绘制,所以了解View绘制原理对于应用开发以及系统的学习至关重要。由于View绘制流程比较复杂,并且涉及的知识非常多,所以后面我会按照下面几方面来介绍View的绘制流程。每篇不是很长,但是尽量的详细,让每个人都看懂。
Android系统源码分析–View绘制流程之-setContentView
Android系统源码分析–View绘制流程之-inflate
Android系统源码分析–View绘制流程之-onMeasure
Android系统源码分析–View绘制流程之-onLayout
Android系统源码分析–View绘制流程之-onDraw
Android系统源码分析–View绘制流程之-硬件加速
Android系统源码分析–View绘制流程之-addView
Android系统源码分析–View绘制流程之-弹性效果
所以这篇我们先分析View绘 ...
Android系统源码分析--ContentProvider
距离上一次写博客已经半年多了,这半年发生了很多事情,也有了很多感触,最主要是改变了忙碌的工作,更加重视身体的健康,为此也把工作地点从深圳这个一线城市换到了珠海,工作相对没有那么累,身体感觉也好了很多。所以在工作完成之余,也有了更多的时间来自我学习和提高,后续会用更多时间来写更多实用的东西,帮助我们理解安卓系统的原理,帮助我们快速、稳定的开发。这一篇我们接着之前的计划,完成四大组件的最后一个ContentProvider的分析。ContentProvider是一个抽象类,用来提供访问数据的统一格式的接口。ContentProvider的作用是多应用间共享数据,如果用户需要直接使用则可以直接在里面使用数据库来保存数据,也可以通用ContentResolver使用URI来存储数据,使用URI用户不需要知道内部怎么存储只需要知道如何使用该存储方式。
ContentProviderContentProvider的描述及使用:在之前我们分析过ContentProvider的启动比Application的启动早,所以使用时需要知道这种情况。在使用ContentResolver时是通过URI来 ...
Android系统源码分析--Service启动流程
在前面文章我们分析了四大组件中的两个:Broadcast和Activity,这章我们分析四大组件中的服务(Service)的启动过程。Service的启动方式有两种:一种是startService,一种是bindService;第一种通常是开启一个服务执行后台任务,不进行通信,第二章通过是启动服务进行通信。下面我们就根据这两种启动方式来讲Service的启动流程以及unbindService和stopService流程。
Service启动流程-startService首先来看启动流程时序图:
Step0.ContextImpl.startService12345@Overridepublic ComponentName startService(Intent service) { warnIfCallingFromSystemProcess(); return startServiceCommon(service, mUser);}
调用当前类中的startServiceCommon方法。
Step1.ContextImpl.startSe ...
Android系统源码分析--Activity的finish过程
上一篇我们分析了Activity的启动流程,由于代码量很大,还是没有分析的很详细,但是基本流程都出来了,更详细的东西还是要去看源码,源码在我文章的最后有给出,里面有我添加的详细的注释。这一章来分析Activity的finish过程,这个问题在两年前我去面试金山的时候曾经被问到过,那时候对源码基本没什么了解,所以当时根本是不了解的,今天我们就来分析一下finish的过程到底做了哪些处理,最后对Activity的整个启动过程以及finish过程绘制流程图,以方便我们记忆。
finish代码分析首先先贴一张时序图:
Activity的finish方法就是调用的父类的finish方法:
Step1.Activity.finish123public void finish() { finish(DONT_FINISH_TASK_WITH_ACTIVITY);}
这里调用finish方法,传入参数DONT_FINISH_TASK_WITH_ACTIVITY,这个参数是在finish掉Activity的时候不finish掉Task。
Step2.Activity ...
Android系统源码分析--Activity启动过程
关于Activity的源码分析拖延了太久的时间,由于最近工作繁忙,加上Activity启动源码非常复杂,涉及的内容很多,所以花费了很长是时间才来写这篇源码分析,希望这篇分析能让我们很容易的理解Activity的启动流程,能解决我们在使用Activity过程中遇到的问题,这样就达到了我们对于源码分析的目的了。下一篇我们介绍Activity的finish过程。
Activity启动模式简介:我们知道Activity启动模式有四种,每一种都有不同的操作,直接影响我们App的设计,为了帮助我们理解源码,我们先分析一下这四种模式。这四种模式包括:standard, singleTop, singleTask 和 singleInstance。
(下面内容来自:Activity启动模式图文详解:standard, singleTop, singleTask 以及 singleInstance)
standard:标准模式,也是默认模式。这种模式是每次你调用startActivity时都会创建一个Activity实例,不管你之前有没有创建过。
singleTop:从名字可以分析出是顶部单 ...
Android系统源码分析--Broadcast发送
上一篇分析了Android系统中广播的注册和注销,这一篇我们继续分析发送广播的源码流程,广播的发送相对来说比较复杂,所以需要比较长的时间来看,如果你看懂了流程相对来说再研究流程中的细节就比较简单了。
先看一张时序图,因为里面涉及到循环过程,代码中会提到,但是时序图没有绘制,所以需要注意一下。
0、ContextImpl.sendBroadcast123456789101112131415161718192021222324252627282930313233343536373839/** * 发送广播 * 步骤: * 1.广播发送者,即一个Activity组件或者一个Service组件,将一个特定类型的广播发送给AMS * <p> * 2.AMS接收到一个广播后,首先找到与这个广播对应的广播接收者,然后将它们添加到一个广播调度队列中, * 最后向AMS所运行在的先从的消息队列发送一个类型为BROADCAST_INTENT_MSG的消息,这时候对广播发送 * 者来说,一个广播就发送完了。 * <p> ...
Android系统源码分析--Broadcast注册和注销
距离上一篇博客进程的加载过了很久的时间,这中间换了一份工作,加入了新的团队,也开始了新的项目,比较忙,所以最近才有时间将四大组件之一的广播原理看完,最近一段时间会相继把四大组件分析写完,让我们对四大组件有更深的了解。本来想一篇把广播的内容写完,但是发现要解释的代码比较多,所以还是分开来讲,那么这篇先分析广播的注册和注销,下一篇再分析广播的发送。
Broadcast的注册
Step-1:注册广播入口ContextImpl.registerReceiver:1234@Overridepublic Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { return registerReceiver(receiver, filter, null, null);}
然后调用registerReceiver复写方法:
123456@Override public Intent registerReceiver(BroadcastReceiver receiver ...
Android系统源码分析--Process启动过程
由于四大组件的启动都涉及到进程的启动,因此我们这章先讲一下进程启动流程,然后再讲四大组件的启动流程。
基础知识Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制;这两个特点都是在进程的初始化过程中实现的。(引用自老罗安卓之旅-Android应用程序进程启动过程的源代码分析)
进程按照重要性可以分为下面五类:
前台进程(Foreground process)
可见进程(Visible process)
服务进程(Service process)
后台进程(Background process)
空进程(Empty process)
进程启动流程AMS(ActivityMagagerService)启动进程是从其成员函数startProcessLocked开始调用Process.start方法开始的。我们先看一下进程启动的时序图:
1. Process.start方法:12345678910111213141516171819202122public static ...
Android系统源码分析--消息循环机制
上一章我们讲解SystemServer时涉及到了消息机制,因此这一章我们先介绍一下消息循环机制,帮助大家弄清楚消息循环的原理,有助于代码的编写和优化。
Looper-Message-MessageQueue-Handler消息处理机制在Android系统有两个通信机制,一个是Binder,一个是消息机制,前者是跨进程通信,后者是进程内部通信。消息通信主要包括几个部分:
消息发送者和处理者:Handler
消息循环器:Looper
消息队列:MessageQueue
消息:Message
我们先看一个时序图:
图中,1-11步是Looper的准备过程,12-17步是获取消息,处理消息,回收消息的循环过程。
下面是一张消息循环过程图,图片来自网络博客(blog.mindorks.com),Looper会通过loop方法不断从消息队列去取消息,然后交给handler处理,处理完成就回收消息,要注意的是只有一个looper,但是可能有多个handler:
1、LooperLooper是一个循环器,通过里面的loop方法不断去取消息,发送给Handler进行处理。根据上面时序图以 ...