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