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

这里的mMainThread也是Activity类的成员变量,它的类型是ActivityThread,它代表的是应用程序的主线程,我们在Android系统在新进程中启动自定义服务过程(startService)的原理分析一文中已经介绍过了。这里通过mMainThread.getApplicationThread获得它里面的ApplicationThread成员变量,它是一个Binder对象,后面我们会看到,ActivityManagerService会使用它来和ActivityThread来进行进程间通信。这里我们需注意的是,这里的mMainThread代表的是Launcher应用程序运行的进程。

这里的mToken也是Activity类的成员变量,它是一个Binder对象的远程接口。

Step 4. Instrumentation.execStartActivity

这个函数定义在frameworks/base/core/java/Android/app/Instrumentation.java文件中:

public class Instrumentation {          ......          public ActivityResult execStartActivity(       Context who, IBinder contextThread, IBinder token, Activity target,       Intent intent, int requestCode) {           IApplicationThread whoThread = (IApplicationThread) contextThread;           if (mActivityMonitors != null) {               ......           }           try {               int result = ActivityManagerNative.getDefault()                   .startActivity(whoThread, intent,                   intent.resolveTypeIfNeeded(who.getContentResolver()),                   null0, token, target != null ? target.mEmbeddedID : null,                   requestCode, falsefalse);               ......           } catch (RemoteException e) {           }           return null;       }          ......      }  

这里的ActivityManagerNative.getDefault返回ActivityManagerService的远程接口,即ActivityManagerProxy接口,具体可以参考Android系统在新进程中启动自定义服务过程(startService)的原理分析一文。

这里的intent.resolveTypeIfNeeded返回这个intent的MIME类型,在这个例子中,没有AndroidManifest.xml设置MainActivity的MIME类型,因此,这里返回null。

这里的target不为null,但是target.mEmbddedID为null,我们不用关注。

Step 5. ActivityManagerProxy.startActivity

这个函数定义在frameworks/base/core/java/android/app/ActivityManagerNative.java文件中:

class ActivityManagerProxy implements IActivityManager   {          ......          public int startActivity(IApplicationThread caller, Intent intent,               String resolvedType, Uri[] grantedUriPermissions, int grantedMode,               IBinder resultTo, String resultWho,               int requestCode, boolean onlyIfNeeded,               boolean debug) throws RemoteException {           Parcel data = Parcel.obtain();           Parcel reply = Parcel.obtain();           data.writeInterfaceToken(IActivityManager.descriptor);           data.writeStrongBinder(caller != null ? caller.asBinder() : null);           intent.writeToParcel(data, 0);           data.writeString(resolvedType);           data.writeTypedArray(grantedUriPermissions, 0);           data.writeInt(grantedMode);           data.writeStrongBinder(resultTo);           data.writeString(resultWho);           data.writeInt(requestCode);           data.writeInt(onlyIfNeeded ? 1 : 0);           data.writeInt(debug ? 1 : 0);           mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);           reply.readException();           int result = reply.readInt();           reply.recycle();           data.recycle();           return result;       }          ......      }   这里的参数比较多,我们先整理一下。从上面的调用可以知道,这里的参数resolvedType、grantedUriPermissions和resultWho均为null;参数caller为ApplicationThread类型的Binder实体;参数resultTo为一个Binder实体的远程接口,我们先不关注它;参数grantedMode为0,我们也先不关注它;参数requestCode为-1;参数onlyIfNeeded和debug均空false。

Step 6. ActivityManagerService.startActivity

上一步Step 5通过Binder驱动程序就进入到ActivityManagerService的startActivity函数来了,它定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:

public final class ActivityManagerService extends ActivityManagerNative           implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {          ......          public final int startActivity(IApplicationThread caller,               Intent intent, String resolvedType, Uri[] grantedUriPermissions,               int grantedMode, IBinder resultTo,               String resultWho, int requestCode, boolean onlyIfNeeded,               boolean debug) {           return mMainStack.startActivityMayWait(caller, intent, resolvedType,               grantedUriPermissions, grantedMode, resultTo, resultWho,               requestCode, onlyIfNeeded, debug, nullnull);       }             ......      }  

        这里只是简单地将操作转发给成员变量mMainStack的startActivityMayWait函数,这里的mMainStack的类型为ActivityStack。

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

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