为了账号安全,请及时绑定邮箱和手机立即绑定

Application,Activity,Service的创建流程(2)

标签:
Java

Activity创建流程

这次从Activity的handleLaunchActivity(...)方法开始分析,因为前面的流程已经在创建Application过程中讲过了。
从代码中我们可以看出Activity是通过performLauncherActivity(...)方法创建的。我们看下这个方法干了啥

private Activity  performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        ...
        ContextImpl appContext = createBaseContextForActivity(r);
        Activity activity = null;        try {
            java.lang.ClassLoader cl = appContext.getClassLoader();
            activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
                StrictMode.incrementExpectedActivityCount(activity.getClass());
            r.intent.setExtrasClassLoader(cl);
            r.intent.prepareToEnterProcess();            if (r.state != null) {
                r.state.setClassLoader(cl);
            }
        } catch (Exception e) {            if (!mInstrumentation.onException(activity, e)) {                throw new RuntimeException(                    "Unable to instantiate activity " + component+ ": " + e.toString(), e);
            }
        }
        ...                if (r.isPersistable()) {
                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                } else {
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                }                if (!activity.mCalled) {                    throw new SuperNotCalledException(                        "Activity " + r.intent.getComponent().toShortString() +                        " did not call through to super.onCreate()");
                }
                r.activity = activity;
                r.stopped = true;                if (!r.activity.mFinished) {
                    activity.performStart();
                    r.stopped = false;
                }                if (!r.activity.mFinished) {                    if (r.isPersistable()) {                        if (r.state != null || r.persistentState != null) {
                            mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,
                                    r.persistentState);
                        }
                    } else if (r.state != null) {
                        mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
                    }
                }
        ...        return activity;
    }

从代码中我们可以看出:

  1. 首先创建了ContextImpl,然后通过Intrumentation的newActivity(...)来创建Activity的实例。

  2. 然后通过Intrumentation的callActivityOnCreate(...)来调用Activity的onCreate()方法

  3. 通过activity.performStart(...)来调用Activity的onStart()方法

  4. 如果上次Activity被异常杀死,则通过Intrumentation的callActivityOnRestoreInstanceState(...)来执行Activity的performRestoreInstanceState(...)方法

  5. 执行完成后则返回Activity实例并回到handleLaunchActivity(...)方法中,通过handleResumeActivity(...)方法来调用Activity的onResume方法。
    以上就是Activity的创建流程.

Service创建流程

AMS完成AMS进程中的Service创建后,通过ApplitionThread的scheduleCreateService(...)方法来通过ActivityThread来创建Client端的Service。下面我们看下scheduleCreateService(...)的源码

        public final void scheduleCreateService(IBinder token,
                ServiceInfo info, CompatibilityInfo compatInfo, int processState) {
            updateProcessState(processState, false);
            CreateServiceData s = new CreateServiceData();
            s.token = token;
            s.info = info;
            s.compatInfo = compatInfo;
            sendMessage(H.CREATE_SERVICE, s);
        }

scheduleCreateService(...)方法会发送CREATE_SERVICE给UI线程,下面看看UI线程的针对这个Message干了什么

     public void handleMessage(Message msg) {           if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));            switch (msg.what) {
    ...       case CREATE_SERVICE:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, ("serviceCreate: " + String.valueOf(msg.obj)));
                    handleCreateService((CreateServiceData)msg.obj);
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;
    ...
    }
     }

UI线程收到CREATE_SERVICE这个message后调用了handleCreateService(...)方法,接着看下handleCreateService(...)干了什么

private void handleCreateService(CreateServiceData data) {
        ...
        LoadedApk loadedApk = getLoadedApkNoCheck(
                data.info.applicationInfo, data.compatInfo);
        Service service = null;        try {
            java.lang.ClassLoader cl = loadedApk.getClassLoader();
            service = (Service) cl.loadClass(data.info.name).newInstance();
        } catch (Exception e) {            if (!mInstrumentation.onException(service, e)) {                throw new RuntimeException(                    "Unable to instantiate service " + data.info.name + ": " + e.toString(), e);
            }
        }        try {            if (localLOGV) Slog.v(TAG, "Creating service " + data.info.name);
            ContextImpl context = ContextImpl.createAppContext(this, loadedApk);
            context.setOuterContext(service);
            Application app = loadedApk.makeApplication(false, mInstrumentation);
            service.attach(context, this, data.info.name, data.token, app,
                    ActivityManager.getService());
            service.onCreate();
            mServices.put(data.token, service);            try {
                ActivityManager.getService().serviceDoneExecuting(
                        data.token, SERVICE_DONE_EXECUTING_ANON, 0, 0);
            } catch (RemoteException e) {                throw e.rethrowFromSystemServer();
            }
        } catch (Exception e) {            if (!mInstrumentation.onException(service, e)) {                throw new RuntimeException(                    "Unable to create service " + data.info.name + ": " + e.toString(), e);
            }
        }
    }

从源码中我们可以看出,首先通过ClassLoader来创建Service的实例。然后创建ContextImpl来让Service attach,由此可以证明,Service对应的mBase也为ContextImpl,然后直接调用Service的onCreate()。



作者:黑狗狗哥
链接:https://www.jianshu.com/p/0b82b7552d43


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
228
获赞与收藏
996

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消