该类作为一个程序的标记,刚开始做android的时候,直接都是着手编写四大组件的上。后来发现一般都是自己写个类来自己继承,然后在onCreate中有限处理一些任务,以及捕捉一些全局性的异常。今天在看api的时候发现里面有几个非常有用的方法。
首先看继承结构:
他继承了ContextWrapper类,顾名思义,Context的包装类,在ContextWrapper中维护这一个正真的Context,被定义为mBase,他是抽象类Context的实现类,叫做ContextImpl.
他是通过如下两种方法来ContextImpl对象附在ContextWrapper的mBase上:
Application的创建:
还是要从Application的创建说起,没有Application,何来上面方法来设置ContextImpl进来(这里从点击桌面上的icon来启动新的应用的方式来谈Application创建)。
当点击桌面上的应用的时候,最终会调用到ActivityThread的performLaunchActivity方法。前面步骤可以参考《老罗的博客》。
2128:这里就是创建Application的开始
ActivityThread.class
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
这里的r.packageInfo是个LoadedApk对象,他调用了LoadedApk里面的:
LoadedApk.class
public Application makeApplication(boolean forceDefaultAppClass,
Instrumentation instrumentation) {
if (mApplication != null) {
return mApplication;
}
Application app = null;
String appClass = mApplicationInfo.className;
if (forceDefaultAppClass || (appClass == null)) {
appClass = "android.app.Application";
}
try {
java.lang.ClassLoader cl = getClassLoader();
ContextImpl appContext = new ContextImpl();
appContext.init(this, null, mActivityThread);
app = mActivityThread.mInstrumentation.newApplication(
cl, appClass, appContext);
appContext.setOuterContext(app);
} catch (Exception e) {
if (!mActivityThread.mInstrumentation.onException(app, e)) {
throw new RuntimeException(
"Unable to instantiate application " + appClass
+ ": " + e.toString(), e);
}
}
mActivityThread.mAllApplications.add(app);
mApplication = app;
if (instrumentation != null) {
try {
instrumentation.callApplicationOnCreate(app);
} catch (Exception e) {
if (!instrumentation.onException(app, e)) {
throw new RuntimeException(
"Unable to create application " + app.getClass().getName()
+ ": " + e.toString(), e);
}
}
}
retu