Android Application啟動流程分析

2021-08-07 18:31:33 字數 1414 閱讀 5005

activities: 前台介面, 直接面向user, 提供ui和操作.

services: 後台任務.

broadcast receivers: 廣播接收者.

contexnt providers: 資料提供者.

android程序與linux程序一樣. 預設情況下, 每個apk執行在自己的linux程序中. 另外, 預設乙個程序裡面只有乙個執行緒—主線程. 這個主線程中有乙個looper例項, 通過呼叫looper.loop()從message佇列裡面取出message來做相應的處理.

那麼, 這個程序何時啟動的呢?

簡單的說, 程序在其需要的時候被啟動. 任意時候, 當使用者或者其他元件調取你的apk中的任意元件時, 如果你的apk沒有執行, 系統會為其建立乙個新的程序並啟動. 通常, 這個程序會持續執行直到被系統殺死. 關鍵是: 程序是在被需要的時候才建立的.

首先, 讓我們快速看下android啟動流程. 與眾多基於linux核心的系統類似, 啟動系統時, bootloader啟動核心和init程序. init程序**出更多名為"daemons(守護程序)"的底層的linux程序, 諸如android debug deamon, usb deamon等. 這些守護程序處理底層硬體相關的介面.
click事件會呼叫startactivity(intent), 會通過binder ipc機制, 最終呼叫到activitymanagerservice. 該service會執行如下操作:

第一步通過packagemanager的resolveintent()收集這個intent物件的指向資訊.

指向資訊被儲存在乙個intent物件中.

下面重要的一步是通過granturipermissionlocked()方法來驗證使用者是否有足夠的許可權去呼叫該intent物件指向的activity.

如果有許可權, activitymanagerservice會檢查並在新的task中啟動目標activity.

現在, 是時候檢查這個程序的processrecord是否存在了.

如果processrecord是null, activitymanagerservice會建立新的程序來例項化目標activity.

2.1 建立程序

activitymanagerservice呼叫startprocesslocked()方法來建立新的程序, 該方法會通過前面講到的socket通道傳遞引數給zygote程序. zygote孵化自身, 並呼叫zygoteinit.main()方法來例項化activitythread物件並最終返回新程序的pid.

activitythread隨後依次呼叫looper.prepareloop()和looper.loop()來開啟訊息迴圈.

流程圖如下:

流程如下:

start activity

ContentProvider啟動流程分析(一)

本片部落格對應時序圖上的step1 5 下接第二篇contentprovider啟動流程分析二!作為安卓設計的四大元件之一,是跨程序共享資料的一把利器,所謂跨程序共享資料,通俗理解就是,應用程式a可以訪問操作應用程式b共享出來的資料,這些共享出來的資料一般都有其對應的uri 統一資源識別符號 那麼就...

專題分綱目錄 android 開機啟動流程分析

android 開機啟動流程分析 01 init之前啟動說明 android 開機啟動流程分析 02 init的啟動流程分析 android 開機啟動流程分析 03 init啟動中關鍵程序 uevent watchdog android 開機啟動流程分析 04 init啟動中關鍵服務 屬性服務 an...

uboot啟動流程概述 uboot啟動流程

u boot系統啟動流程 大多數bootloader都分為stage1和stage2兩大部分,u boot也不例外。依賴於cpu體系結構的 如裝置初始化 等 通常都放在stage1,且可以用組合語言來實現,而stage2則通常用c語言來實現,這樣可以實現複雜的功能,而且有更好的可讀性和移植性。2.1...