您的位置:首页 > 移动开发 > Android开发

Android 开发之漫漫长途Ⅰ—Android 系统的创世之初以及 Activity 的生命周期

2017-12-13 11:49 330 查看
前言

该文章是一个系列文章,是本人在 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 的生命周期——由生到死

Activity 的生命周期


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



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


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

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

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 的启动便是由 AMS 向 zygote进程发起消息(这个说法并不精确由于
AMS 运行在 SystemServer 进程中,所以其本质还是由SystemServer
进程向 zygote
进程发起消息)。如上图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐