2011-9-27 21:33:17

来源:互联网 发布:数据库基础教程下载 编辑:程序博客网 时间:2024/04/28 08:33
 

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