Android系统在新进程中启动自定义服务过程(sta(4)

 函数首先通过retrieveServiceLocked来解析service这个Intent,就是解析前面我们在AndroidManifest.xml定义的Service标签的intent-filter相关内容,然后将解析结果放在res.record中,然后继续调用bringUpServiceLocked进一步处理。

Step 3. ActivityManagerService.bringUpServiceLocked
        这个函数同样定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:

 

public final class ActivityManagerService extends ActivityManagerNative                               implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {          ......          private final boolean bringUpServiceLocked(ServiceRecord r,                       int intentFlags, boolean whileRestarting) {              ......              final String appName = r.processName;              ......              // Not running -- get it started, and enqueue this service record            // to be executed when the app comes up.            if (startProcessLocked(appName, r.appInfo, true, intentFlags,                       "service", r.name, false) == null) {                  ......                  return false;           }              if (!mPendingServices.contains(r)) {               mPendingServices.add(r);           }              return true;          }          ......      }  

        这里的appName便是我们前面在AndroidManifest.xml文件定义service标签时指定的android:process属性值了,即“.Server”。

接着调用startProcessLocked函数来创建一个新的进程,以便加载自定义的Service类。最后将这个ServiceRecord保存在成员变量mPendingServices列表中,后面会用到。

Step 4. ActivityManagerService.startProcessLocked

这个函数同样定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:

 

public final class ActivityManagerService extends ActivityManagerNative                               implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {          ......          private final void startProcessLocked(ProcessRecord app,                   String hostingType, String hostingNameStr) {              ......              try {                  ......                  int pid = Process.start("android.app.ActivityThread",                               mSimpleProcessManagement ? app.processName : null, uid, uid,                               gids, debugFlags, null);                  ......                  if (pid == 0 || pid == MY_PID) {                                      ......                  } else if (pid > 0) {                   app.pid = pid;                   app.removed = false;                   synchronized (mPidsSelfLocked) {                       this.mPidsSelfLocked.put(pid, app);                       ......                   }               } else {                                      ......               }              } catch (RuntimeException e) {                  ......              }          }          ......      }  

         这里调用Process.start函数创建了一个新的进程,指定新的进程执行android.app.ActivityThread类。最后将表示这个新进程的ProcessRecord保存在mPidSelfLocked列表中,后面会用到。

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwddpy.html