# 3 Activity設計框架
### 3.1 外特性空間的Activity
我們先來看看,Android應用開發人員接觸的外特性空間中的Activity,對于AMS來講,這個Activity就是客服端的Activity。應用程序員在建立Android應用時,構建Activity的子類就是Andoid外特性空間展現的接口。我們可以從下面的簡單的例子描述看看Activity,到底如何建立的。
~~~
DemoActivity extend Activity
{
onCreate
onResume
onPause
onStop
}
~~~
在Android的外特性空間(SDK)中,Android應用程序員根本不知道進程是什么時候起來的,系統消息是如何傳遞過來的。這個DemoActivity是如何實例化的呢?并且該Activity是托管在哪個進程的呢?本節的分析將給出答案。
我們從ActivityThread中可以看到在應用進程中的Activity都被放置在mActivities中。
[](#)
這些ActivityRecord記錄了應用進程中,程序員建立的Activity子類的實例,我們稱之為外特性空間的Activity。這些Activity類實例是放在應用程序端進行實際交互的Activity,而為了管理這些Activity,AMS內核中還有一個影子Activity,被稱為HistoryRecord。
3.2 Activity與HistoryRecord的關系
在整個系統中,Activity實際上有兩個實體。一個在應用進程中跟應用程序員打交道的Activity,一個是在AMS的中具有管理功能的History Record。應用進程中的Activity都登記ActivityThread實例中的mActivity數組中,而在AM端,HistroytRecord實例放置在mHistroy棧中。mHistory棧是Android管理Activity的場所,放置在棧頂的就是User看到的處于活動狀態的Activity。
Activity與HistrotyRecord的關系圖可以表示如下:
[](#)
Activity的內核實體是依靠在ProcessRecord的成員變量中,通過ProcessRecord我們可以訪問到所有的屬于該Process的Activity。而在ProcessRecord記錄了與應用進程之間的聯系:IActivtityThread接口。通過該接口,可以訪問到所對應的Activity的方法。在Launch Activity時,AMS將對應的HistoryRecord作為token傳遞到客服端和客服端的Activity建立聯系。在AMS中Activity狀態變化時,將通過該聯系找到客服端的Activity,從而將消息或者動作傳遞應用程序面對的接口:xxxActivity。
### 3.3 Actvity的Launch過程
1)發起請求startActivity(intent)
2)Activity Service Manager接收到請求執行StartActivity函數。
建立:HistoryRecord實例r.
將r 加入到mHistory頂。
(3)通過app.thread.scheduleLaunchActvity( [app,r)@ActivityThread.java](#)
(4)在App應用中建立新的ActivityRecord。
(5)建立新的Activity對象并放入到ActivityRecord中。
(6)將ActivityRecord加入到mActivites@ActivityThread
(7)發起Activity.onCreate(..),,該onCreate就是在你的應用程序XXXActivity中的onCreate。
[](#)
### 3.4 Activity的Resume
(1)Activity什么時候被Resume
[](#)
(2)Rusume的過程
通過該過程的研究我們會進一步的了解到AMS與應用進程的交互過程。
在AMS端,滿足resume條件都會調用:Resume的核心函數:[resumeTopActivityLocked@ActivityManagerService](#)
XXX當前棧頂的HistroyRecord
1)窗口切換:隱藏前一個Activity的窗口,
2)更新LRUList,(LRUList是淘汰應用程序的依據之一)
3) XXX.app.thread.scheduleResumeActivity(XXX,
isNextTransitionForward());
4)completeResumeLocked
setFocusedActivityLocked
mFocusActivity=xxx? //此時焦點Actvitiy切換了。
WM.setFocusedApp(xxx,
mWindowManager.executeAppTransition();
mNoAnimActivities.clear();
在應用程序端:
(5)scheduleResumeActivity
handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) {
ActivityRecord r = performResumeActivity(token, clearHide);
ActivityRecord r = mActivities.get(token);
r.activity.performResume()
performResume
整個Resume的過程如下:
[](#)
- 前言
- (一)分析方法論探討之設計意圖
- (二)方法論探討之概念空間篇
- (三)手機之硬件形態
- (四)手機的軟件形態
- (五)基本空間劃分
- (六)IPC框架分析 Binder,Service,Service manager
- (七)Service深入分析
- (八)Android 啟動過程詳解
- (九)Zygote Service
- (十)Android GWES之基本原理篇
- (十一)Android GWES之消息系統
- (十二)Android GEWS窗口管理之基本架構原理
- (十三)Android GWES之Android窗口管理
- (十四)Android GWES之輸入系統
- (十五)Android輸入系統之輸入路徑詳解
- (十六)Android電話系統-概述篇
- (十七)電話系統之rilD
- (十八)Android電話系統之RIL-Java
- (十九)電話系統之GSMCallTacker
- (二十)Android應用程序框架之無邊界設計意圖
- (二十一)Android應用框架之AndroidApplication
- (二十二)Android應用框架之Activity
- (二十三)Andoird GDI之基本原理及其總體框架
- (二十四)Android GDI之顯示緩沖管理
- (二十五)Android GDI之共享緩沖區機制
- (二十六)Android GDI之SurfaceFlinger
- (二十七)Android GDI 之SurfaceFlinger之動態結構示意圖
- (二十八)Android GDI之Surface&Canvas