當前位置:首頁 » 安卓系統 » android啟動activity

android啟動activity

發布時間: 2025-03-07 20:51:24

A. Android 是怎麼啟動一個Acitivity的

可以把啟動過程分為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》。

B. android 主activity用什麼啟動模式

在android里,有4種activity的啟動模式,分別為:
「standard」 (默認)
「singleTop」
「singleTask」
「singleInstance」

1. 如何決定所屬task
「standard」和」singleTop」的activity的目標task,和收到的Intent的發送者在同一個task內,除非intent包括參數FLAG_ACTIVITY_NEW_TASK。
如果提供了FLAG_ACTIVITY_NEW_TASK參數,會啟動到別的task里。
2. 是否允許多個實例
「standard」和」singleTop」可以被實例化多次,並且存在於不同的task中,且一個task可以包括一個activity的多個實例;
「singleTask」和」singleInstance」則限制只生成一個實例,並且是task的根元素。
singleTop要求如果創建intent的時候棧頂已經有要創建 的Activity的實例,則將intent發送給該實例,而不發送給新的實例。

3. 是否允許其它activity存在於本task內
「singleInstance」獨佔一個task,其它activity不能存在那個task里;如果它啟動了一個新的activity,不管新的activity的launch mode 如何,新的activity都將會到別的task里運行(如同加了FLAG_ACTIVITY_NEW_TASK參數)。
而另外三種模式,則可以和其它activity共存。

4. 是否每次都生成新實例
「standard」對於沒一個啟動Intent都會生成一個activity的新實例;
「singleTop」的activity如果在task的棧頂的話,則不生成新的該activity的實例,直接使用棧頂的實例,否則,生成該activity的實例。
比如現在task棧元素為A-B-C-D(D在棧頂),這時候給D發一個啟動intent,如果D是 「standard」的,則生成D的一個新實例,棧變為A-B-C-D-D。
如果D是singleTop的話,則不會生產D的新實例,棧狀態仍為A-B-C-D
如果這時候給B發Intent的話,不管B的launchmode是」standard」 還是 「singleTop」 ,都會生成B的新實例,棧狀態變為A-B-C-D-B。

「singleInstance」是其所在棧的唯一activity,它會每次都被重用。

「singleTask」如果在棧頂,則接受intent,否則,該intent會被丟棄,但是該task仍會回到前台。

當已經存在的activity實例處理新的intent時候,會調用onNewIntent()方法
如果收到intent生成一個activity實例,那麼用戶可以通過back鍵回到上一個狀態;如果是已經存在的一個activity來處理這個intent的話,用戶不能通過按back鍵返回到這之前的狀態。

總結如下:
standard 每次都會新建,每個Task都可以有,且每個Task都可以有多個實例(每個Task都可以有,且可以有多個)
singleTop 當前實例如果在棧頂,就不新建實例,調用其OnNewIntent。 如不在棧頂,則新建實例 (每個Task都可以有,且可以有多個,在棧頂時可復用)
singleTask 新建一個Task,如果已經有其他的Task並且包含該實例,那就直接調用那個Task的實例。(只有一個Task中會有)
singleInstance 新建一個Task,且在該Task中只有它的唯一一個實例。 (只有一個Task會有,且該Task中只有它)

FLAG_ACTIVITY_NEW_TASK 類似singleTask
FLAG_ACTIVITY_SINGLE_TOP 類似singleTop
FLAG_ACTIVITY_CLEAR_TOP 無對應

熱點內容
vivo如何關閉qq隱私密碼鎖 發布:2025-05-01 14:28:27 瀏覽:504
宇視監控怎麼配置國際編碼 發布:2025-05-01 14:26:55 瀏覽:823
安卓如何改變手機版本 發布:2025-05-01 14:25:57 瀏覽:775
android外國 發布:2025-05-01 14:25:55 瀏覽:782
資料庫上億數據 發布:2025-05-01 14:18:31 瀏覽:582
資料庫查詢不為空的 發布:2025-05-01 14:16:48 瀏覽:255
c語言求轉置矩陣 發布:2025-05-01 14:13:39 瀏覽:721
反抗磁力ftp 發布:2025-05-01 14:13:37 瀏覽:361
mfc操作sql 發布:2025-05-01 14:09:59 瀏覽:496
c清空瀏覽器緩存 發布:2025-05-01 13:51:21 瀏覽:424