1. 程式人生 > >android 面試Activity啟動流程

android 面試Activity啟動流程

android 面試題之Activity的啟動流程

面試中高階的時候,很多公司都會問對Activity的啟動流程瞭解嗎?這時候內心真是一萬隻草泥馬奔騰而過,都沒準備說啥啊!市場上對Activity啟動這塊分析的文章很多,但是面試過程中簡短的描述就需要很熟悉原始碼並且用精煉的語言描述出來。先看下大佬是怎麼回答這個問題的:

Activity的啟動過程,我們可以從Context的startActivity說起,其實現是ContextImpl的startActivity,然後內部會通過Instrumentation來嘗試啟動Activity,這是一個跨程序過程,它會呼叫ams的startActivity方法,當ams校驗完activity的合法性後,會通過ApplicationThread回撥到我們的程序,這也是一次跨程序過程,而applicationThread就是一個binder,回撥邏輯是在binder執行緒池中完成的,所以需要通過Handler H將其切換到ui執行緒,第一個訊息是LAUNCH_ACTIVITY,它對應handleLaunchActivity,在這個方法裡完成了Activity的建立和啟動,接著,在activity的onResume中,activity的內容將開始渲染到window上,然後開始繪製直到我們看見。——任玉剛大佬

詳細分析如下

當我們在activity中呼叫startActivity方法來開啟一個Activity的時候,呼叫流程如下:
startActivity—->startActivity(intent,bundle)–>startActivityForResult(intent,-1,bundle)
呼叫到startActivityForResult的時候,具體方法是:

public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) {
        if
(mParent == null) { options = transferSpringboardActivityOptions(options); 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()); } if (requestCode >= 0) { // If this start is requesting a result, we can avoid making // the activity visible until the result is received. Setting // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the // activity hidden during this time, to avoid flickering. // This can only be done when a result is requested because // that guarantees we will get information back when the // activity is finished, no matter what happens to it. mStartedActivity = true; } cancelInputsAndStartExitTransition(options); // TODO Consider clearing/flushing other event sources and events for child windows. } else { if (options != null) { mParent.startActivityFromChild(this, intent, requestCode, options); } else { // Note we want to go through this method for compatibility with // existing applications that may have overridden it. mParent.startActivityFromChild(this, intent, requestCode); } } }

這裡會先判斷mParent是否為Null,mParent的意思是父類Activity,剛開始進來的mParent是為null的,所以後邊開始呼叫
Instumentation.execStartActivity。
當我們使用Context.startActivity的時候,最後也是呼叫mMainThread.getInstrumentation().execStartActivity方法
那麼Instrumentation有什麼用呢?為何要在Instrumentation中去執行execStartActivity方法?
Instrumentation是在任何應用程式執行前進行初始化的,可以用它來檢測系統和應用程式間的互動。每一個activity都會
持有instrumentation的引用,但是整個程序只有一個instrumentation例項,instrumentation相當於一個大管家,管理著
activity和application的生命週期,包括activity的建立。

現在我們來看看Intrumentation的execStartActivity方法。

    public ActivityResult execStartActivity(Context who,IBinder contextThread,IBinder token,Activity target,Intent intent,int requestCode,bundle options){
       ...
       ActivityManagerNative.getService().startActivity();
          }
context who:activity所在的上下文
IBinder contextThread:上下文所在的主執行緒
IBinder token:啟動的activity的標識
Activity target:被啟動的activity
Intent intent:傳入的intent
int requestCode:請求碼
bundle options:額外的引數

那麼Instrumentation是如何建立activity以及執行activity的生命週期方法的呢?是誰傳遞過來的資訊?
是ActivityThread。通過ActivityThread來告訴Instrumentation來執行activity的生命週期方法以及建立activity,那麼
ActivityThread又是那個類通知的呢?是AMS。
AMS通過Binder通訊告訴ActivityThread,該建立一個新的Activity了,那麼ActivityThread則會呼叫Instrumentation來
建立一個Activity。
好,我們接著上邊的ActivityManagerNative.getDefault()來講,這個getDefault方法返回的是什麼呢?返回的是ActivityManagerService的
遠端介面,也就是ActivityManagerProxy。再看ActivityManagerProxy.startActivity則就是利用Binder進行通訊,把所有的引數資料封裝在Parcel
物件裡,然後通過binder物件的transact方法傳輸到AMS。
ActivityManagerProxy(客戶端)====>Binder驅動(中轉站)====>ActivityManagerService(服務端) (Binder是單向通訊的)

到此就是Activity建立傳遞到AMS的一個過程,後邊就是ActivityManagerService拿到資料和標識之後開始做一些合法性驗證
然後再利用Binder進行通訊告訴(?告訴那個類)來做建立

AMS接收到客戶端請求之後,會如何建立一個Activity?如何回撥到應用層並切換到H上呢?
下次再分解,也可以參考下邊的連結

相關推薦

android 面試Activity啟動流程

android 面試題之Activity的啟動流程 面試中高階的時候,很多公司都會問對Activity的啟動流程瞭解嗎?這時候內心真是一萬隻草泥馬奔騰而過,都沒準備說啥啊!市場上對Activity啟動這塊分析的文章很多,但是面試過程中簡短的描述就需要很熟悉原始

Android 元件Activity啟動流程分析

本篇相關流程分析基於Android4.4原始碼。 通常我們啟動一個Activity都是通過startActivity來完成。下面我們分析一下關鍵流程,本篇中以前應用的主執行緒ActivityThread為界限一分為二。 意圖啟動 首先我們使用上下文物件來

AndroidActivity啟動流程詳解(基於api28)

### 前言 Activity作為Android四大元件之一,他的啟動絕對沒有那麼簡單。這裡涉及到了系統服務程序,啟動過程細節很多,這裡我只展示主體流程。activity的啟動流程隨著版本的更替,程式碼細節一直在進行更改,每次都會有很大的修改,如android5.0 android8.0。我這裡的版本是基於

Android】原始碼分析 - Activity啟動流程

啟動Activity的方式 Activity有2種啟動的方式,一種是在Launcher介面點選應用的圖示、另一種是在應用中通過Intent進行跳轉。我們主要介紹與後者相關的啟動流程。 Intent intent = new Intent(this, TestActivity

Android 元件系列 -- Activity 啟動流程(9.0)

在學習完Android應用程式啟動過程原始碼分析,針對最新Android9.0的程式碼,以相應的順序再次學習。在9.0的版本中對於Activity的啟動流程上並沒有太大的變化,但是在程式碼層面,改動的卻很多。 流程概覽 以Launcher啟動APP為例: Lau

Android 外掛化分析(3)- Activity啟動流程

在真正分析外掛化技術前,我們必須瞭解一些必要的關於Android四大元件的相關知識。 以Activity為例,我們需要了解Activity啟動過程,才能有效的進行Hook實現外掛化。 以Android 8.1為例 我們啟動一個Activity通常會使用startActi

Android面試——Activity的四種啟動模式

前言 今天開始,會逐步總結Android面試可能遇到的各種問題及其知識點總結。為的就是今天4月份的晉升面試或者更好機會的面試能夠拿出100%的狀態。 有興趣的同學,也可以關注我的Android面試資料夾。 Activity四種啟動模式 Activ

Activity啟動流程分析(基於android 5.1)

最近由於工作需要,需要深入瞭解AMS的內部實現。說老實話,雖然已經經過了幾輪重構,AMS的程式碼還是又臭又長。。。 萬事開頭難,先找個入口開始看吧。當從Launcher介面點選啟動一個app時,會啟動一個新的activity。所以就從startActivity()看起,研究

Android APK打包安裝、應用程序啟動過程、Activity啟動流程

目錄 一、Android APK的構建過程 通過IDE可以生成可以在android裝置中安裝的apk檔案,Google官方提供的構建APK的過程流程圖如下: 打包APK流程總結如下: AAPT(Android Asset Packaging Tool)工

Android應用程式activity啟動流程簡介

  無論是通過點選應用程式圖示來啟動Activity,還是通過Activity內部呼叫startActivity介面來啟動新的Activity,都要藉助於應用程式框架層的ActivityManagerService服務程序。Service也是由ActivityManager

Android Activity啟動流程分析

概述 Activity作為Android的四大元件之一,Android主要的介面組成部分,用於直接跟使用者進行互動操作,在面試中與Activity相關的知識也是經常被問到,如果你面試的高階崗位,那麼對Activity的啟動和繪製流程就必須的熟悉,本文將從Act

Android Activity啟動流程(基於Android8.0系統)

主要物件介紹 ActivityManagerService:負責系統中所有Activity的生命週期; Activi

Android 9.0)Activity啟動流程原始碼分析

前言 熟悉Activity的啟動流程和執行原理是一個合格的應用開發人員所應該具備的基本素質,其重要程度就

深入理解Activity啟動流程(二)–Activity啟動相關類的類圖

b- ive ava ani affinity server 組織 詳細 pac 本文原創作者:Cloud Chou. 歡迎轉載,請註明出處和本文鏈接 本系列博客將詳細闡述Activity的啟動流程,這些博客基於Cm 10.1源碼研究。 在介紹Activity的詳細啟動流程

Activity 啟動流程

Activity 啟動呼叫流程 (基於5.0原始碼) 我們從 startActivity 開始: startActivity() startActivity()方法有多個過載,但是都會呼叫到 startActivityResult: public void startA

Android9.0 Activity啟動流程分析(二)

文章目錄 1、ActivityThread的main函式 2. AMS的attachApplication函式 2.1 Part-I 2.2 Part-II 2.2.1 ApplicationThread的bindApp

Android9.0 Activity啟動流程分析(一)

1、ActivityRecord、TaskRecord、ActivityStack和ActivityDisplay介紹   本篇文章是基於Android refs/tags/android-9.0.0_r8分支的程式碼進行分析的   在分析Activity啟動的原始碼之前先介紹一下Act

AndroidActivity啟動過程探究

首先追溯到Activity的啟動,隨便啟動一個自己寫的demo專案,使用DDMS進行debug標記,然後在Debug中把主執行緒暫停,可以看到呼叫棧。如下圖所示: 於是我們先看android.app.ActivityThread的main()方法。 android.a

Activity啟動流程詳解

看到上面的標記A: 看到標記C處,這個IApplicationThread是什麼呢?這個我在Activity生命週期回撥是如何被回撥的?有解釋過,這裡我簡單的解釋一下:這個IApplicationThread是Android應用程式提供對外(即系統ActivityMana

Android面試 - Activity相關會問些什麼

本文包括以下內容(針對Android面試,部分細節略去): 1. Activity生命週期 2. Activity四種啟動模式及其應用場景 3. IntentFilter匹配規則 (Activity和Fragment、Service互動會在其他文章中寫到) 更多An