Android 是怎麼啟動一個Acitivity的?,androidacitivity

來源:互聯網
上載者:User

Android 是怎麼啟動一個Acitivity的?,androidacitivity

可以把啟動過程分為client端和server端。

一、client端在啟動一個Activity時進行的工作

備忘:我個人理解,client端指的是相對後台ActivityManagerService進程來說的前台使用者可見的進程,如在介面啟動某一個Activity的就是Laucher進程。這裡則以從home案頭啟動一個Activity來分析啟動過程:

(1)Launcher這個進程的主線程,在捕獲onClick點擊事件後,調用startActivitySafely方法,startActivitySafely方法內部調用了

startActivity方法,然後,startActivity方法進而調用Launcher的父類Activity的startActivity方法;

 

(2)Activity.startActivity方法調用startActivityForResult方法,傳入該方法的requestCode參數為 -1,表示 Activity啟動成功後,不需要執行 Lanucher.onActivityResult方法處理返回結果;startActivityForResult方法內部需要調用 Instrumentation 的 execStartActivity方法。Instrumentation對象是用於監控應用程式和系統(主要是 Activity Manager)的互動過程。

(3)execStartActivity方法會把將要啟動的Activity相關資訊傳送到ActivityManagerService如果 ActivityMonitor對啟動Activity進行檢查沒問題,那麼會調用 ActivityManagerNative.getDault得到ActivityManagerProxy代理對象,然後調用該代理對象的startActivity方法。;

(4)調用ActivityManagerProxy代理對象的startActivity方法實際上是調用 BinderProxy.transact向 Binder驅動發送 START_ACTIVITY_TRANSACTION命令,此時就從Lanucher進程切換到ActivityManagerService進程了。

 

總結上述四步:源Activity(這裡是Launcher)所屬進程通過一系列方法,(無論是通過Launcher來啟動Activity,還是通過Activity內部調用startActivity介面來啟動新的Activit,都通過Binder處理序間通訊進入到ActivityManagerService進程中,並且調用ActivityManagerService.startActivity介面; 


二、Lanucher進程處理Activity的啟動請求,就是Client端的工作,傳遞給 Server端的 ActivityManagerService後。就是ActivityManagerService進程的處理過程了。

 

處理過程將分為 7個階段

1、第一階段——開機前檢查

這個階段,主要工作是檢查是否有許可權啟動該Activity,查詢系統中是否存在指定Intent的Activity,檢查Intent是否正確,檢查當前能否切換Activity,各種檢查通過後建立目標Activity的ActivityRecord,判斷是否有可複用的Task或者Activity,有則關聯ActivityRecord,無則建立Task,更新ActivityManagerService中Task的數量,檢查回退棧頂是否有顯示的Activity,有則暫停。

 

2、第二階段——暫停

這個階段的主要工作就是暫停啟動目標 Activity的源Activity,比如,我是從Actvity A啟動Activity B的,那麼在啟動B之前需要把A暫停,

針對暫停Activity的後續處理,要麼是執行destroy操作,要麼是存入等待stop列表;

 

3、第三階段——建立目標Activity所啟動並執行進程

準備切換動畫,查詢ActivityManagerService的mProcessNames變數中是否存在指定的進程資訊,有則複用,直接啟動Activity,無則通過zygote啟動一個新的進程。進程啟動逾時時間一般是10s。

 

4、第四階段——載入應用程式Activity

進程入口是 ActivityThread的main方法,main方法裡的主要工作是設定臨時進程名,建立 UI主線程ActivityThread,並調用其attach方法,最後進入主線程的訊息迴圈。接下來的工作是為低記憶體裝置禁用硬體加速,建立應用程式對應的Application,並初始化,安裝 Content Provider,執行Instrumentation的onCreate方法,執行Application的 onCreate方法。

 

5、第五階段——顯示Acitivity

在ActivityManagerService所在進程嚮應用程式主線程的訊息迴圈發送 LANUCHER_ACTIVITY訊息,然後在主線程中回調Activity生命週期的onCreate, onStart,onResume等方法來顯示 Activity,onResume方法執行完畢後,需要先把當前顯示Activity所在的Task加入最近Task列表,然後才返回ActivityManagerService作後續處理。(在onResume方法之前,還可能會先回調onNewIntent和 onActivityResult方法)


 

6、第六階段——處理處於空閑狀態的Activitiy

 

包括移除ActivityStack訊息迴圈中的逾時MSG,停止待停止列表總得Activity,銷毀待銷毀的Activity,如果是系統啟動階段,還要發送一個ACTION_BOOT_COMPLETEED廣播,回收待回收應用程式進程等。最重要的一個操作就是停止源Activity


備忘:此文是讀書所得,主要歸納於老羅的《Android 原始碼情景分析》和楊雲君老師的《Android的設計與實現I》。



android 多個activity怎知道開啟程式時首先是顯示哪個activity

這個在manifest檔案裡可以配置的.
 
在開發android程式時,怎在一個project裡選擇啟動不同的activity類?怎設定?啟動參數?

首先我不清楚你的要求。
按我的理解:

1.你不要求啟動ac1.java,而是選擇啟動ac2.java。如果這樣,你可以在AndroidManifest.xml中更改啟動類,假如ac2.java的類名是TwoActivity,
將(類名..)改為TwoActivity。
<activity
android:name=".(類名..)"
android:label="@string/app_name"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

2.你既要啟動ac1.java,也要啟動ac2.java,我認為不能同時啟動,畢竟你就一個螢幕,不可能顯示兩個螢幕的內容。除非你有一個選擇,遇到第一種情況顯示ac1.java;遇到第二種情況顯示ac2.java。但是其中存在一個問題,這個if語句在那裡寫,xml中似乎沒辦法寫,也就只能在java檔案裡面寫了。也就是說ac1.java與ac2.java的代碼要組合起來,寫在一個.java檔案中。
你可以從建立立一個Activity,你有兩個布局XML檔案one.xml與two.xml,在這個Activity中的onCreate方法中
if (情況1){
setContentView(R.layout.one);
} else (情況2) {
setContentView(R.layout.two);
}
這樣你就可以選擇兩種布局,情況1的時候初始化情況1的變數,情況2的時候初始化情況2的變數,分開寫就可以了。

3.就是分順序啟動2個檔案,從ac1.java中跳轉到ac2.java中,在ac1.java中使用startActivity(intent);就可以跳轉。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.