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

作者 : 开心源码 本文共4106个字,预计阅读时间需要11分钟 发布时间: 2022-05-12 共110人阅读

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()。

由此,Service的创立过程已经分析完毕了。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Application,Activity,Service的创立流程(2)

发表回复