ActivityInfo aInfo = r.activityInfo; ...
ComponentName component = r.intent.getComponent(); ...
Activity activity = null; try {
//② 通过类加载器将activity的类加载进来,然后创建activity对象 java.lang.ClassLoader cl = r.packageInfo.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) { ... }
try {
//③ 创建Application,也就是AndroidManifest.xml配置的 Application app = r.packageInfo.makeApplication(false, mInstrumentation); ...
if (activity != null) {
//④ 创建Activity的上下文Content,并通过attach方法将这些信息设置到Activity中去
Context appContext = createBaseContextForActivity(r, activity);
CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager()); Configuration config = new Configuration(mCompatConfiguration);
//⑤ 调用activity的attach()方法,这个方法的作用主要是为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);
if (customIntent != null) {
activity.mIntent = customIntent; }
r.lastNonConfigurationInstances = null; activity.mStartedActivity = false;
int theme = r.activityInfo.getThemeResource(); if (theme != 0) {
activity.setTheme(theme); }
activity.mCalled = false; /*
* ⑥ 通过mInstrumentation调用activity的onCreate()方法,
* mInstrumentation的作用是监控Activity与系统的交互操做。 * 这时候activity的生命周期就开始了 */
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState); } else {
mInstrumentation.callActivityOnCreate(activity, r.state); }
//下面主要为堆栈中的ActivityClientRecord设置一些数据 ...
r.activity = activity; r.stopped = true;
if (!r.activity.mFinished) { activity.performStart(); r.stopped = false; } ... }
r.paused = true; ...
} catch (SuperNotCalledException e) { throw e;
} catch (Exception e) {
if (!mInstrumentation.onException(activity, e)) { throw new RuntimeException(
\ + \ } }
return activity; }
performLaunchActivity ()中首先根据activity的className加载类文件,并创建activity实例,然后初始化上下文Context,并调用attach()
方法初始化activity,最后通过mInstrumentation回调activity的onCreate()方法,这样Activity算是创建完成了。
这篇博客涉及到的内容还是比较多,每个过程中主要的代码注释已经标示的比较清楚了,还有些细节问题有兴趣的可以更加深入的去研究,
相信如果弄懂这个流程后,再去深入也不是什么难事了。项目中framwork层的源码都是参照android5.0版本,如果下载源码有问题的同学可以
在本篇博客末尾下载博客研究的工程(主要的源码已经摘录放入到工程中),也可以参考
http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/。
接下来对本篇博客稍作总结:
step1-step3:通过Binder机制将创建activity的消息传给ActivityManagerService
step4-step8:根据activity的启动模式判断activity是否应该重新创建,还是只需要置于栈顶,并将目标activity记录放在栈顶
step9-step10:判断activity是否已经创建,如果已经创建将直接置于resume状态,如果没有创建便重新开启
step11-step12:判断activity所属的进程是否创建,如果没有创建将启动新的进程,如果创建了就直接启动activity
step13-step15:进程的主线程执行ActivityThread的main方法,然后初始化进程相关的东西
step16-step21:实例化栈顶的activity对象,并调用Activity.attach()初始化,回调onCreate()生命周期方法;然后调用
ActivityThread.handleResumeActivity()使activity处于resume状态
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Activtiy完全解析(一、Activity的创建过程)(8)在线全文阅读。
相关推荐: