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


先来个最简单的HelloWord代码,用Android Studio 3.0新建项目(一直使用默认)后会自动生成一个HelloWorld的项目,如下:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.helloword.MainActivity"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" /> </android.support.constraint.ConstraintLayout>

MainActivity.java

package com.helloword;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

我们启动应用程序,安装到手机或者模拟器上,界面显示了一行字“Hello World!”。我们的激动无以言表。下面来看看MainActivity的生命周期——由生到死

** 1. Activity的生命周期 **

典型状态下的生命周期分析

(注:图片来自《Android开发艺术探索》,关于各个状态的说明以及如何测试请参看该书籍,这不是本系列的重点)

异常状况下的生命周期分析

(注:图片来自《Android开发艺术探索》,关于各个状态的说明以及如何测试请参看该书籍,这不是本系列的重点)


** 2.Android系统的创世之初(本章重点) **

相信前面的知识只要有一些开发经验的就了解。这不是本章的重点,倘若有不太了解的同学可自行查看。那么本章重点来了,在Activity的生命周期开始之前是怎么样的呢,Activity的onCreate这个Activity的入口(开始)函数又是在哪里调用的呢。下面我们来看一下整个Android应用程序的生母吧。

① Android下的进程(看清楚不是线程哦)

我们在开发Android应用程序的时候经常使用到线程,那么有没有想过进程呢。要知道进程才是分配资源的最小单位。我们知道Andriod是基于Linux系统的。所以Linux系统的启动过程或许能给我们一些启发。

Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2),我们只介绍0,1

> **idle进程由系统自动创建, 运行在内核态**
> idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_thread产生的进程。完成加载系统后,演变为进程调度、交换
>**init进程由idle通过kernel_thread创建,在内核空间完成初始化后, 加载init程序, 并最终用户空间**
>由0进程创建,完成系统的初始化. 是系统中所有其它用户进程的祖先进程
>Linux中的所有进程都是有init进程创建并运行的。首先Linux内核启动,然后在用户空间中启动init进程,再启动>其他系统进程。在系统启动完成完成后,init将变为守护进程监视系统其他进程。
由上可知**init**进程是Linux系统中所有其他用户进程的祖先进程。其实它也是Android系统的第一个进程。init进程负责创建系统中的几个关键进程,其中之一的**zygote**,是Java世界的开创者。**zygote**进程如何创建以及之后的流程我们不具体分析源码,因为那涉及到Native层,我们用一张图来表示。

② Activity的启动过程

前文已经讲到,zygote分裂出嫡长子system_server后,就通过runSelectLoopMode等待并处理来自客户的消息了,那么,谁会向zygote发送消息呢?这里以一个Activity的启动为例,具体分析zygote是如何分裂和繁殖的。

ActivityManagerService也是由SystemServer创建的。 假设通过startActivity来启动一个新的Activity,而这个Activity附属于一个还未启动的进程,那么这个进程该如何启动呢?继续上图,结合上一张图

Activity的创建在上述的main函数中,具体我们就不分析了。


本篇总结:

本篇文档主要讲了Activity的生命周期以及Android创世之初所走的道路,总结起来就是init进程创建了zygote进程zygote进程 进行了一些初始化之后便创建了SystemServer进程,之后便zygote进程调用了runSelectLoopMode()函数等待请求,SystemServer进程创建了Android系统的服务,其中ActivityManagerService(简称AMS)是Android中最核心的服务,主要负责系统中四大组件的启动、 切换、 调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似。Activity的启动便是由AMSzygote进程发起消息(这个说法并不精确由于AMS运行在SystemServer进程中,所以其本质还是由SystemServer进程zygote进程发起消息)。如上图


此致,敬礼

Android开发之漫漫长途 Ⅰ——Android系统的创世之初以及Activity的生命周期的更多相关文章

  1. Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  2. Android开发之漫漫长途 Ⅶ——Android消息机制(Looper Handler MessageQueue Message)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  3. Android开发之漫漫长途 Ⅱ——Activity的显示之Window和View(2)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  4. Android开发之漫漫长途 XI——从I到X的小结

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  5. Android开发之漫漫长途 Ⅲ——Activity的显示之Window和View(2)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  6. Android开发之漫漫长途 XIII——Fragment最佳实践

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  7. Android开发之漫漫长途 Ⅳ——Activity的显示之ViewRootImpl初探

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  8. Android开发之漫漫长途 Ⅴ——Activity的显示之ViewRootImpl的PreMeasure、WindowLayout、EndMeasure、Layout、Draw

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  9. Android开发之漫漫长途 番外篇——自定义View的各种姿势1

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

随机推荐

  1. 第4章 同步控制 Synchronization ----同步机制的摘要

    同步机制摘要Critical Section Critical section(临界区)用来实现"排他性占有".适用范围是单一进程的各线程之间.它是:  一个局部性对象,不是一个核 ...

  2. P3377

    题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除或第x和第y个数在用一个堆 ...

  3. python --- json模块和pickle模块详解

    json:JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式(用于数据序列化和反序列化).(适用于多种编程语言,可以与其他编程语言做数据交换 ...

  4. 浪潮之巅——IT产业的三大定律

    说实话除了小说以外,从来没有什么书能让我一口气看完,更不用说IT界的书了.但是吴军老师的<浪潮之巅>这本书除外,电子版的洋洋洒洒五百多页,我一下午就将其看完了.全书通过介绍AT&T ...

  5. 即时通信系统Openfire分析之五:会话管理

    什么是会话? A拨了B的电话 电话接通 A问道:Are you OK? B回复:I have a bug! A挂了电话 这整个过程就是会话. 会话(Session)是一个客户与服务器之间的不中断的请求 ...

  6. 【框架学习与探究之消息队列--EasyNetQ(2)】

    声明 本文欢迎转载,系博主原创,本文原始链接地址:http://www.cnblogs.com/DjlNet/p/7654902.html 前言 此文章,是承接上篇:[框架学习与探究之消息队列--Ea ...

  7. DevOps之服务手册

    唠叨话 关于德语噢屁事的知识点,仅提供精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <DevOps服务手册(Manual)> <IT资源目标化>1.设施和设备(I ...

  8. 【转载】jQuery动画中的queue()函数

    原文链接:http://www.cnblogs.com/hh54188/archive/2011/04/09/1996469.html 原文摘要:当你使用一系列的动画效果(如hide,show),这些 ...

  9. Javascript之pixi框架学习

    pixi 创建渲染器(renderer) 创建一个可以播放动画的区域,相当于(canvas). var renderer = PIXI.autoDetectRenderer(512, 512); do ...

  10. CMake必知必会

    CMake 文档 https://cmake.org/cmake/help/v3.7/index.html 需要阅读的文档 item note link cmake-buildsystem(7) cm ...