Android应用程序启动过程源代码分析(4)

Step 7. ActivityStack.startActivityMayWait

这个函数定义在frameworks/base/services/java/com/Android/server/am/ActivityStack.java文件中:

public class ActivityStack {          ......          final int startActivityMayWait(IApplicationThread caller,               Intent intent, String resolvedType, Uri[] grantedUriPermissions,               int grantedMode, IBinder resultTo,               String resultWho, int requestCode, boolean onlyIfNeeded,               boolean debug, WaitResult outResult, Configuration config) {              ......              boolean componentSpecified = intent.getComponent() != null;              // Don't modify the client's object!            intent = new Intent(intent);              // Collect information about the target of the Intent.            ActivityInfo aInfo;           try {               ResolveInfo rInfo =                   AppGlobals.getPackageManager().resolveIntent(                   intent, resolvedType,                   PackageManager.MATCH_DEFAULT_ONLY                   | ActivityManagerService.STOCK_PM_FLAGS);               aInfo = rInfo != null ? rInfo.activityInfo : null;           } catch (RemoteException e) {               ......           }              if (aInfo != null) {               // Store the found target back into the intent, because now that                // we have it we never want to do this again.  For example, if the                // user navigates back to this point in the history, we should                // always restart the exact same activity.                intent.setComponent(new ComponentName(                   aInfo.applicationInfo.packageName, aInfo.name));               ......           }              synchronized (mService) {               int callingPid;               int callingUid;               if (caller == null) {                   ......               } else {                   callingPid = callingUid = -1;               }                  mConfigWillChange = config != null                   && mService.mConfiguration.diff(config) != 0;                  ......                  if (mMainStack && aInfo != null &&                   (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {                                              ......                  }                  int res = startActivityLocked(caller, intent, resolvedType,                   grantedUriPermissions, grantedMode, aInfo,                   resultTo, resultWho, requestCode, callingPid, callingUid,                   onlyIfNeeded, componentSpecified);                  if (mConfigWillChange && mMainStack) {                   ......               }                  ......                  if (outResult != null) {                   ......               }                  return res;           }          }          ......      }  

        注意,从Step 6传下来的参数outResult和config均为null,此外,表达式(aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0为false,因此,这里忽略了无关代码。

下面语句对参数intent的内容进行解析,得到MainActivity的相关信息,保存在aInfo变量中:

   ActivityInfo aInfo;      try {   ResolveInfo rInfo =   AppGlobals.getPackageManager().resolveIntent(       intent, resolvedType,       PackageManager.MATCH_DEFAULT_ONLY       | ActivityManagerService.STOCK_PM_FLAGS);   aInfo = rInfo != null ? rInfo.activityInfo : null;      } catch (RemoteException e) {       ......      }  

        解析之后,得到的aInfo.applicationInfo.packageName的值为"shy.luo.activity",aInfo.name的值为"shy.luo.activity.MainActivity",这是在这个实例的配置文件AndroidManifest.xml里面配置的。

此外,函数开始的地方调用intent.getComponent()函数的返回值不为null,因此,这里的componentSpecified变量为true。

接下去就调用startActivityLocked进一步处理了。

Step 8. ActivityStack.startActivityLocked

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

public class ActivityStack {          ......          final int startActivityLocked(IApplicationThread caller,               Intent intent, String resolvedType,               Uri[] grantedUriPermissions,               int grantedMode, ActivityInfo aInfo, IBinder resultTo,                   String resultWho, int requestCode,               int callingPid, int callingUid, boolean onlyIfNeeded,               boolean componentSpecified) {               int err = START_SUCCESS;              ProcessRecord callerApp = null;           if (caller != null) {               callerApp = mService.getRecordForAppLocked(caller);               if (callerApp != null) {                   callingPid = callerApp.pid;                   callingUid = callerApp.info.uid;               } else {                   ......               }           }              ......              ActivityRecord sourceRecord = null;           ActivityRecord resultRecord = null;           if (resultTo != null) {               int index = indexOfTokenLocked(resultTo);                              ......                                  if (index >= 0) {                   sourceRecord = (ActivityRecord)mHistory.get(index);                   if (requestCode >= 0 && !sourceRecord.finishing) {                       ......                   }               }           }              int launchFlags = intent.getFlags();              if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0               && sourceRecord != null) {               ......           }              if (err == START_SUCCESS && intent.getComponent() == null) {               ......           }              if (err == START_SUCCESS && aInfo == null) {               ......           }              if (err != START_SUCCESS) {               ......           }              ......              ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid,               intent, resolvedType, aInfo, mService.mConfiguration,               resultRecord, resultWho, requestCode, componentSpecified);              ......              return startActivityUncheckedLocked(r, sourceRecord,               grantedUriPermissions, grantedMode, onlyIfNeeded, true);       }             ......      }  

        从传进来的参数caller得到调用者的进程信息,并保存在callerApp变量中,这里就是Launcher应用程序的进程信息了。

前面说过,参数resultTo是Launcher这个Activity里面的一个Binder对象,通过它可以获得Launcher这个Activity的相关信息,保存在sourceRecord变量中。
        再接下来,创建即将要启动的Activity的相关信息,并保存在r变量中:

ActivityRecord r = new ActivityRecord(mService, this, callerApp, callingUid,       intent, resolvedType, aInfo, mService.mConfiguration,       resultRecord, resultWho, requestCode, componentSpecified);  

        接着调用startActivityUncheckedLocked函数进行下一步操作。

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

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