2011-9-27 21:33:17

 

2011-9-27 21:33:17

現在,我們如何來確認SubActivity是不是在新的進程中啓動呢?Android源代碼工程爲我們準備了adb工具,可以查看模擬器上系統運行的狀況,執行下面的命令查看:


view plaincopy to clipboardprint?
01.USER-NAME@MACHINE-NAME:~/Android$ adb shell dumpsys activity 
USER-NAME@MACHINE-NAME:~/Android$ adb shell dumpsys activity       這個命令輸出的內容比較多,這裏我們只關心繫統中的任務和進程部分:


view plaincopy to clipboardprint?
01....... 
02. 
03.Running activities (most recent first): 
04.    TaskRecord{40770440 #3 A shy.luo.process} 
05.      Run #2: HistoryRecord{406d4b20 shy.luo.process/.SubActivity} 
06.      Run #1: HistoryRecord{40662bd8 shy.luo.process/.MainActivity} 
07.    TaskRecord{40679eb8 #2 A com.android.launcher} 
08.      Run #0: HistoryRecord{40677570 com.android.launcher/com.android.launcher2.Launcher} 
09. 
10....... 
11. 
12.PID mappings: 
13.    ...... 
14. 
15.    PID #416: ProcessRecord{4064b720 416:shy.luo.process:shy.luo.process.main/10037} 
16.    PID #425: ProcessRecord{406ddc30 425:shy.luo.process:shy.luo.process.sub/10037} 
17. 
18....... 
......

Running activities (most recent first):
    TaskRecord{40770440 #3 A shy.luo.process}
      Run #2: HistoryRecord{406d4b20 shy.luo.process/.SubActivity}
      Run #1: HistoryRecord{40662bd8 shy.luo.process/.MainActivity}
    TaskRecord{40679eb8 #2 A com.android.launcher}
      Run #0: HistoryRecord{40677570 com.android.launcher/com.android.launcher2.Launcher}

......

PID mappings:
    ......

    PID #416: ProcessRecord{4064b720 416:shy.luo.process:shy.luo.process.main/10037}
    PID #425: ProcessRecord{406ddc30 425:shy.luo.process:shy.luo.process.sub/10037}

......
        這裏我們看到,雖然MainActivity和SubActivity都是在同一個應用程序並且運行在同一個任務中,然而,它們卻是運行在兩個不同的進程中,這就可以看到Android系統中任務這個概念的強大之處了,它使得我們在開發應用程序的時候,可以把相對獨立的模塊放在獨立的進程中運行,以降低模塊之間的耦合性,同時,我們又不必去考慮一個應用程序在兩個進程中運行的細節的問題,Android系統中的任務會爲我們打點好一切。

        在啓動Activity的時候,系統是如何做到在新的進程中來啓動這個Activity的呢?在前面兩篇文章Android應用程序啓動過程源代碼分析和Android應用程序內部啓動Activity過程(startActivity)的源代碼分析中,分別在Step 22和Step 21中分析了Activity在啓動過程中與進程相關的函數ActivityStack.startSpecificActivityLocked函數中,它定義在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:


view plaincopy to clipboardprint?
01.public class ActivityStack {   
02.   
03.    ......   
04.   
05.    private final void startSpecificActivityLocked(ActivityRecord r,   
06.            boolean andResume, boolean checkConfig) {   
07.        // Is this activity's application already running?    
08.        ProcessRecord app = mService.getProcessRecordLocked(r.processName,   
09.            r.info.applicationInfo.uid);   
10.   
11.        ......   
12.   
13.        if (app != null && app.thread != null) {   
14.            try {   
15.                realStartActivityLocked(r, app, andResume, checkConfig);   
16.                return;   
17.            } catch (RemoteException e) {   
18.                ......   
19.            }   
20.        }   
21.   
22.        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,   
23.            "activity", r.intent.getComponent(), false);   
24.    }   
25.   
26.   
27.    ......   
28.   
29.}   

 

adb shell dumpsys activity

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章