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进行处理。根据上面时序图以 ...
Android系统源码分析--Zygote和SystemServer启动过程
按计划本来从这章开始写四大组件的启动过程的,但是看看源码结构发现为了说的更明白还是先写一点系统framework层启动的内容,帮助理解四大组件的启动以及管理过程。我们知道四大组件管理是通过一些服务以及线程实现的,所以先把一些基本概念弄清楚比较好,比如AMS(ActivityManagerService)、PMS(PackageManagerService)等系统服务的作用以及调用方式,了解这些之后再看四大组件相对容易些,因此我们本章先介绍系统启动、部分系统服务的作用。
Zygote启动过程Zygote是一个孕育器,Android系统所有的应用进程以及系统服务SystemServer都是有Zygote进程孕育(fork)而生的,因此Zygote在Android启动过程中起着决定作用。Zygote的启动是从它的main函数开始的,因此我们从这个函数开始分析。整个过程看下面的时序图。
下面我们开始根据时序图进行分析。
Step 0.ZygoteInit.main
123456789101112131415161718192021222324252627282930public st ...
Android系统源码分析--Context
Android是一个开源系统,至少说是大部分开源的,源代码的学习对于我们学习Android帮助非常大,可能很多人看看源码时感觉代码太多了,不知道从何开始,今天我就从基本的部分开始跟大家一起学习Android源码。声明:本篇以及以后Android源码分析是基于Android-7.1.2_r11(7.1版本系统)源码进行分析。如果之后切换会进行声明。希望对照源码学习的要找对应版本进行查看。
在开始介绍Context前我们先看一张Android系统框架层的图:
从上面图可以看到Android系统主要分为五层:应用层,应用框架层,Native库和运行环境,硬件抽象层和Linux内核层。本章不重点讲Android系统框架,只是开始给大家展示一下,有个了解,我们先从Framework层开始学习,首先学习Context,下面进入正题。
概述:做Android开发的朋友在开发过程中时刻用到Context,那么Context到底是什么,到底是做什么的我们详细分析一下。源码中解释Context是一个面向应用全局信息的接口,那么我看看哪些信息与Context有关:
获取AssetManager: ...
IntelliJ IDEA导入Android源码
我们知道在Windows系统下阅读源码利器是Source Insight,但是没有Mac版本,阅读源码一直是个问题,之前我写过关于阅读源码神器的Understand,但是如果项目过大则很慢,所以也不能用来阅读Android系统源码,在网上也查过Sublime text配置ctag,但是相对来说也是不方便,后来使用Visual Studio Code和Sublime text相差不多,最后想到用IntelliJ IDEA来阅读源码,如果直接导入则会分为很多module。最近从网上看到可以导入IntelliJ IDEA软件,所以给大家分享一下。本教程基于Mac OS X 10.12。Android系统版本为:7.1.2_r11(7.1.2最终版)。先介绍方法,后面会给出各种问题解决方案。
生成导入idea或者eclipse需要的文件:
1.首先是idea和eclipse导入项目需要的文件
123.classpath (Eclipse)android.ipr (IntelliJ / Android Studio)android.iml (IntelliJ / Android Stu ...
墨香带你学Launcher之(八)- 加载Icon、设置壁纸
上一章墨香带你学Launcher之(七)- 小部件的加载、添加以及大小调节介绍了小部件的加载以及添加过程,基于我的计划对于Launcher的讲解基本要完成了,因此本篇是我对Launcher讲解的最后一部分,计划了很久,因为时间的问题一直没有写,今天趁着有空写完。写了八篇,不多,Launcher里面还有很多东西,有兴趣的可以自己继续研究,看完这些主要的其他都是问题了,有什么需要了解的可以留言。最新版的Launcher代码我已经放到github上,想看的自己可以去下载。
加载Icon对于Icon的操作其实主要是加载、更新以及删除,加载主要是启动Launcher、安装应用,更新是在更新应用时更新Icon、删除是卸载应用时会删除Icon,因此我们可以从这几方面分析Icon的处理。
Launcher启动时Icon加载Launcher的数据加载流程我在第二篇墨香带你学Launcher之(二)- 数据加载流程讲过,不熟悉的可以去看看。首先是将xml文件中配置的Apk信息解析保存到数据库,然后读取数据库,查看手机中是否存在该apk,如果有加载相关信息,加载流程在“loadWorkspace”方 ...