1. 程式人生 > >深入理解Activity啟動流程(三)–Activity啟動的詳細流程1

深入理解Activity啟動流程(三)–Activity啟動的詳細流程1

本系列部落格將詳細闡述Activity的啟動流程,這些部落格基於Cm 10.1原始碼研究。

本篇部落格將開始介紹Activity啟動的詳細流程,由於詳細啟動流程非常複雜,故此分成兩篇來介紹。

本篇主要介紹前半部分的啟動流程:

  • 1. Activity呼叫ActivityManagerService啟動應用
  • 2. ActivityManagerService呼叫Zygote孵化應用程序
  • 3. Zygote孵化應用程序

下篇介紹後半部分的啟動流程:

  • 4. 新程序啟動ActivityThread
  • 5. 應用程序繫結到ActivityManagerService
  • 6. ActivityThread的Handler處理啟動Activity的訊息

1. Activity呼叫ActivityManagerService啟動應用

點選圖片可看大圖

activity_amservice

在launcher應用程式裡啟動應用時,點選應用圖示後,launcher程式會呼叫startActivity啟動應用,傳遞的intent引數:

1
2
3
intent = new Intent(Intent.ACTION_MAIN);
   intent.addCategory(Intent.CATEGORY_LAUNCHER);
   intent.setComponent(className);

activity最終呼叫Instrumentation的execStartActivity來啟動應用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Activity類
public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
 if (mParent == null) {
Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread
.getApplicationThread(), mToken, this, intent, requestCode, options); if (ar != null) { mMainThread.sendActivityResult( mToken, mEmbeddedID, requestCode, ar.getResultCode(), ar.getResultData()); } //... }else{ //... }

Instrumentation呼叫ActivityManagerProxy物件的startActivity方法啟動Activity,而ActivityManagerProxy只是ActivityManagerService物件在應用程序的一個代理物件,ActivityManagerProxy最終呼叫ActivityManagerService的startActvity方法啟動Activity。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Instrumentation類
public ActivityResult execStartActivity(
          Context who, IBinder contextThread, IBinder token, Activity target,
          Intent intent, int requestCode, Bundle options) {
//...
 try{          
   //...
   int result = ActivityManagerNative.getDefault()
                .startActivity(whoThread, intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, null, options);
   } catch (RemoteException e) {
   }   
//...   
}                     

2. ActivityManagerService呼叫Zygote孵化應用程序

點選圖片可看大圖

amservice_zygote

ActivityManagerProxy物件呼叫ActivityManagerService物件(執行在system_server程序)的startActivity方法以啟動應用,startActivity方法接下來呼叫startActivityAsUser方法以啟動應用。在startActivityAsUser方法裡會呼叫ActivityStack的startActivityMayWait方法以啟動應用,startActivityMayWait方法裡啟動應用時,需先根據intent在系統中找到合適的應用的activity,如果有多個activity可選擇,則會彈出ResolverActivity讓使用者選擇合適的應用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//ActivityStack類
final int startActivityMayWait(IApplicationThread caller, int callingUid,
            Intent intent, String resolvedType, IBinder resultTo,
            String resultWho, int requestCode, int startFlags, String 
            
           

相關推薦

深入理解Activity啟動流程()–Activity啟動詳細流程1

本系列部落格將詳細闡述Activity的啟動流程,這些部落格基於Cm 10.1原始碼研究。 本篇部落格將開始介紹Activity啟動的詳細流程,由於詳細啟動流程非常複雜,故此分成兩篇來介紹。 本篇主要介紹前半部分的啟動流程: 1. Activit

深入理解 JBoss 7/WildFly Domain 模式啟動過程

ket builder 代碼調試 ref finished rop mas stopped rgs 概述JBoss 7/WildFly 以 domain 模式啟動時會啟動多個 JVM。比如例如以下通過啟動腳本啟動 domain 模式:./domain.sh啟動後我們查看進

深入理解mysql-進階知識點,啟動項、系統變數、字符集介紹!

mysql資料庫是當前應用最為的廣泛的資料庫,在實際工作中也經常接觸到。真正用好mysql也不僅僅是會寫sql就行,更重要的是真正理解其內部的工作原理。本文先從巨集觀角度介紹一些mysql相關的知識點,目的是為了讓大家對mysql能有一個大體上的認知,後續再逐一對每個知識點的進行深入解讀。 > 本文主

深入理解計算機系統 第章大略和第五章大略

$0 一個 編譯 存儲器 系統 32位 做了 ++i 擴展 這2章總結的很少,主要是覺得沒那麽重要。 1.2個操作數的指令,第二個操作數通常是目的操作數:movb a b,move a to b,而add a b,b+=a,指令分為指令類,如mov類:movb,movw,m

深入理解JAVA集合系列:HashMap的死循環解讀

現在 最新 star and 場景 所有 image cap 時也 由於在公司項目中偶爾會遇到HashMap死循環造成CPU100%,重啟後問題消失,隔一段時間又會反復出現。今天在這裏來仔細剖析下多線程情況下HashMap所帶來的問題: 1、多線程put操作後,get操作導

[轉]深入理解閉包(

copy AI strong 查找 cte 分組操作 spa 方法 詳細介紹 嚴格來講,IIFE並不是閉包,因為它並不滿足函數成為閉包的三個條件。但一般地,人們認為IIFE就是閉包,畢竟閉包有多個定義。本文將詳細介紹IIFE的實現和用途 實現   函數跟隨一對圓括號()

<深入理解計算機系統(第版)》第一章

第一章 計算機系統漫遊 計算機系統是由硬體和系統軟體組成的,它們共同工作來執行應用程式. 1.1 資訊就是位+上下文 源程式實際上就是由一個值0和1組成的位(bit)序列,8個位被組織成一組,稱為位元組.每個位元組表示程式中某個文字字元. 大部分現代系統都是有ASCII標準表示文字字元,只由ASCII字

深入理解計算機系統 第章 程式的機器級表示 part1

  如題所示,這一章講解了程式在機器中是怎樣表示的,主要講組合語言與機器語言。   學習什麼,為什麼學,以及學了之後有什麼用 我們不用學習如何建立機器級的程式碼,但是我們要能夠閱讀和理解機器級的程式碼。 雖然現代的優化編譯器能夠很有效的將高階程式碼翻譯成機器級的程式碼,但是,為了

深入理解計算機系統 第章 程式的機器級表示 part2

  這周由於時間和精力有限,只讀一小節:3.4.4  壓入和彈出棧資料   棧是一種特殊的資料結構,遵循“後進先出”的原則,可以用陣列實現,總是從陣列的一端插入和刪除元素,這一端被稱為棧頂。   棧有兩個常用指令: push:把資料壓入棧中 pop:刪除資

深入理解計算機系統 第章 程式的機器級表示 part3

  這周看了劉老師提供的相關視訊,以及書中對應的章節“3.7 過程”   這一節分為執行時棧、轉移控制、資料傳送、棧上的區域性儲存、暫存器中的區域性儲存空間和遞迴過程這 6 個小節   其中前 3 小節看懂了一部分內容,後面兩個還沒來得及看,下週看完補上  

深入理解 Laravel Eloquent()——模型刪除及軟刪除相關實現

1、刪除模型 1.1 使用delete刪除模型 刪除模型很簡單,先獲取要刪除的模型例項,然後呼叫delete方法即可: $post = Post::find(5); if($post->delete()){ echo '刪除文章成功!'; }else{ echo '

深入理解Java虛擬機器()之垃圾收集

深入理解Java虛擬機器系列文章 垃圾收集演算法 標記-清除演算法 最基礎的收集演算法,包括“標記”和“清除”2個階段 首先標記出所有需要回收的物件,標記過程見前文的2次標記,標記完以後統一回收所有

深入理解OkHttp3:()連線(Connections)

儘管我們只提供給OkHttp一個URL,但OkHttp計劃使用三種類型來連線到伺服器:URL、地址(Address)、和路由(Route)。 URLs URL(比如https://github.com/square/okhttp)是HTTP和網際網路的基礎。除了是web上

深入理解JVM虛擬機器():虛擬機器效能監控工具

本部落格將講解Java虛擬機器效能監控工具的使用以及對Java虛擬機器進行效能監控的實驗。Java開發人員需要對虛擬機器效能監控工具的使用進行掌握,這是很有必要的。 1.概述 給一個系統定位問題的時候,知識、經驗是關鍵基礎,資料是依據。工具是運用知識處理資料的手段。這裡說的資料包括:

深入理解Tomcat系列之 Connector

                     前言Connector是Tomcat的聯結器,其主要任務是負責處理瀏覽器傳送過來的請求,並建立一個Request和Response的物件用於和瀏覽器交換資料,然後產生一個執行緒用於處理請求,Connector會把Request和Response物件傳遞給該執行緒,該執

深入理解計算機系統筆記

這一點之前自己也有這樣的疑惑,就是當一個由w位組成的資料型別,如果要移動k≥w位會得到什麼樣的結果呢?C語言標準規避了在這種情況,比如對於w=32時,k分別是32,36和40時,位移量是通過k mode w得到的。這時候位移運算分別是移動0, 4, 8位。不過,對於這種行為C

深入理解阻塞佇列()——LinkedBlockingQueue原始碼分析

LinkedBlockingQueue是一個基於連結串列實現的可選容量的阻塞佇列。隊頭的元素是插入時間最長的,隊尾的元素是最新插入的。新的元素將會被插入到佇列的尾部。 LinkedBlockingQueue的容量限制是可選的,如果在初始化時沒有指定容量,那麼預

深入理解計算機系統第版》第章家庭作業參考答案

簡述 最近看docker和k8s的底層實現原理,嚴重感覺自己對底層的知識瞭解不足,於是開始業餘時間深入看一些底層書籍,就找了本據說是理解整個計算機體系的入門書-《深入理解計算機系統》.直接買的最新的第三版,從第三章開始看的,第二章接下來有心情再看(看了幾眼全是

[第五章] 深入理解計算機系統第版 家庭作業參考答案

5.13 A. 畫圖: 關鍵路徑為第三幅圖加粗部分 B. 下界為浮點加法的延遲界限,CPE 為 3.00 C. 整數加法的延遲界限,CPE 為 1.00 D. 關鍵路徑上只有浮點加法 5.14 v

[第八章] 深入理解計算機系統第版 家庭作業參考答案

8.9 程序對 併發麼? AB × AC √ AD √ BC √ BD √ CD √ 8.10 A. fork B. longjmp execve C. setjmp 8.11 4次,畫畫程序圖就行了 8.12 8次