該文章是一個系列文章,是本人在Android開發的漫漫長途上的一點感想和記錄,我會盡可能按照先易後難的順序進行編寫該系列。該系列引用了《Android開發藝術探索》以及《深刻理解Android 卷Ⅰ,Ⅱ》中的相關知識,另外也借鑑了其餘的優質博客,在此向各位大神表示感謝,膜拜!!!另外,本系列文章知識可能須要有必定Android開發基礎和項目經驗的同窗才能更好理解,也就是說該系列文章面向的是Android中高級開發工程師。java
先來個最簡單的HelloWord代碼,用Android Studio 3.0新建項目(一直使用默認)後會自動生成一個HelloWorld的項目,以下:android
activity_main.xmlapp
<?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.javaide
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開發藝術探索》,關於各個狀態的說明以及如何測試請參看該書籍,這不是本系列的重點)oop
(注:圖片來自《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附屬於一個還未啓動的進程,那麼這個進程該如何啓動呢?繼續上圖,結合上一張圖code
Activity的建立在上述的main函數中,具體咱們就不分析了。
本篇總結: 本篇文檔主要講了Activity的生命週期以及Android創世之初所走的道路,總結起來就是init進程建立了zygote進程,zygote進程 進行了一些初始化以後便建立了SystemServer進程,以後便zygote進程調用了runSelectLoopMode()函數等待請求,SystemServer進程建立了Android系統的服務,其中ActivityManagerService(簡稱AMS)是Android中最核心的服務,主要負責系統中四大組件的啓動、 切換、 調度及應用進程的管理和調度等工做,其職責與操做系統中的進程管理和調度模塊相似。Activity的啓動即是由AMS向zygote進程發起消息(這個說法並不精確因爲AMS運行在SystemServer進程中,因此其本質仍是由SystemServer進程向zygote進程發起消息)。如上圖
此致,敬禮