App启动(三)Activity的创建

9 篇文章 0 订阅
7 篇文章 0 订阅

上一篇我们讲到AMS在被远程调用attachApplication方法后,会在attachApplicationLocked方法里远程调用ApplicationThreadbindApplication创建Application对象。实际上attachApplicationLocked方法不止进行了Application对象的创建在创建完Application对象后还进行了Activity的创建,我们这次多看一点它的源码

1.ActivityManagerService#attachApplicationLocked

private final boolean attachApplicationLocked(IApplicationThread thread,
            int pid) {

        ......

        try {
        ......
            //1.发送启动Application
            thread.bindApplication(...);
        ......
        } catch (Exception e) {
        ......
            return false;
        }
        ......
        if (normalMode) {
            try {
                //2.启动activity
                if (mStackSupervisor.attachApplicationLocked(app)) {
                    didSomething = true;
                }
            } catch (Exception e) {
                ...
            }
        }

        ......

        return true;
    }

可以看到它执行了mStackSupervisor.attachApplicationLocked(app)方法去创建一个ActivitymStackSupervisor是一个ActivityStackSupervisor类型的对象,下面看该方法的源码

boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
    ... 
    try {
        //调用realStartActivityLocked方法真正启动activity
        if (realStartActivityLocked(hr, app, true, true)) {
            didSomething = true;
        }
    } catch (RemoteException e) {
	...
    }
    ...
	return didSomething;
}

接下来是realStartActivityLocked方法

final boolean realStartActivityLocked(ActivityRecord r,
            ProcessRecord app, boolean andResume, boolean checkConfig)
            throws RemoteException {
    ......
    try {
        ......
        app.thread.scheduleLaunchActivity(...);
        ......
    } catch (RemoteException e) {
        ......
    }
    ......
    return true;
}

可以看到最后通过调用app.thread.scheduleLaunchActivity方法进行创建Activity,而app.thread就是

之前讲的mAppThread对象的Binder代理对象,也就是说此时AMS又通过Binder机制远程调用了ApplicationThreadscheduleLaunchActivity方法去进行Activity创建。

2.ApplicationThread#scheduleLaunchActivity方法

@Override
        public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
                ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
                CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
                int procState, Bundle state, PersistableBundle persistentState,
                List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
                boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {
     ...
     //将消息交给H类型的mH处理
     sendMessage(H.LAUNCH_ACTIVITY, r);
}

可以看到Application的创建一样,通过Handler机制发送了H.LAUNCH_ACTIVITY消息交给了H类进行分发处理,而实际上H类将其交给ActivityThreadhandleLaunchActivity方法进行处理

3.ActivityThread#handleLaunchActivity

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ......
    //1.执行Activity的初始化及oncreate方法
    Activity a = performLaunchActivity(r, customIntent);

    if (a != null) {
        ......
        //2.执行Activity的onResume方法
        handleResumeActivity(r.token, false, r.isForward,!r.activity.mFinished && !r.startsNotResumed);
        ......
    } else {
        ......
    }
   
}

实际的Activity创建是交给performLaunchActivity方法处理的

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ......
    Activity activity = null;
    try {
        ...
        //1.创建activity
        activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
        ...
        } catch (Exception e) {
            ...
        }

    try {
        //2.创建Application,实质上Application已经创建,只是获得已有的Application 实例
        Application app = r.packageInfo.makeApplication(false, mInstrumentation);
        ......
        if (activity != null) {
            //3.创建context
            Context appContext = createBaseContextForActivity(r, activity);
            ......
            //4.将Context和Application 与activity关联起来,完成activity的初始化
             activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor);
            //5.调用activity的oncreate方法
            if (r.isPersistable()) {
                mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
            } else {
                mInstrumentation.callActivityOnCreate(activity, r.state);
            }
            ......
        } catch (SuperNotCalledException e) {
            ...
        }
        return activity;
    }

实际创建 Activity 这里还是使用 Instrumentation 的对象,而mInstrumentation.newActivity方法跟

newApplication方法一样用反射创建出Activity

创建出ActivityperformLaunchActivity 方法开始使用mInstrumentation 调用 Activity的声onCreate生命周期

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值