博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Application,Activity,Service的创建流程(2)
阅读量:6412 次
发布时间:2019-06-23

本文共 5790 字,大约阅读时间需要 19 分钟。

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的创建过程已经分析完毕了。

转载地址:http://ewura.baihongyu.com/

你可能感兴趣的文章
iTerm2快速SSH连接并保存密码
查看>>
人民币中间价“8连贬” 中国央行喊话震慑空头
查看>>
【图】广度优先算法(BFS)
查看>>
Python爬虫入门教程 63-100 Python字体反爬之一,没办法,这个必须写,反爬第3篇...
查看>>
云计算学习路线,简论云计算学习的重要性
查看>>
Java并发编程Bug源头:可见性、原子性和有序性问题
查看>>
支配vue框架初阶项目之博客网站-文件结构调整
查看>>
Slog45_项目上线之域名的购买
查看>>
java B2B2C电子商务平台分析之八--配置中心svn示例和refresh
查看>>
Promise应用场景
查看>>
代码重构技巧(二)
查看>>
spring mvc配置 + dbcp数据源+jdbcTemplate
查看>>
React源码分析
查看>>
vue渲染时闪烁{{}}的问题及解决方法
查看>>
基于物理的渲染
查看>>
《深入理解Java虚拟机》第12章思维导图-Java内存模型与线程
查看>>
无限极分类原理与实现
查看>>
Spring Cloud 学习笔记 大纲
查看>>
前端工程师的方向性总结和建议
查看>>
我的年终总结
查看>>