内容简介:Context: 是一个抽象类。ContextImpl: 是Context真正的实现类。ContextWrapper: 继承Context,是一个包装类,有一个mBase的成员变量,mBase是Context类型,Context抽象方法都是由mBase实现的。子类通过调用attachBaseContext方法替换mBase成员变量。
Context: 是一个抽象类。
ContextImpl: 是Context真正的实现类。
ContextWrapper: 继承Context,是一个包装类,有一个mBase的成员变量,mBase是Context类型,Context抽象方法都是由mBase实现的。子类通过调用attachBaseContext方法替换mBase成员变量。
Application, Activity, Service都是继承ContextWrapper,它们的真正的实现都是ContextImpl实例,
通过attachBaseContext方法把ContextImpl实例赋值给mBase。
所以在activity或者application中常用的方法,例如 :
- getSharedPreferences(String name, int mode)
- startActivity
- sendBroadcast
- 等等等
上述的常用的方法真正实现都是在ContextImpl
2. 源码分析
2.1 Application创建为例
Application的实例从ActivityThread的handleBindApplication(),再到LoadedApk的makeApplication()创建的。
第一步:LoadedApk的makeApplication方法
cl是ClassLoader, appClass是Application的全类名, 通过ContextImpl.createAppContext创建一个ContextImpl实例,把ContextImpl实例、cl、appClass传到mInstrumentation.newApplication方法创建Application实例。
第二步: Instrumentation的newApplication方法
public Application newApplication(ClassLoader cl, String className, Context context) throws InstantiationException, IllegalAccessException, ClassNotFoundException { return newApplication(cl.loadClass(className), context); } static public Application newApplication(Class<?> clazz, Context context) throws InstantiationException, IllegalAccessException, ClassNotFoundException { Application app = (Application)clazz.newInstance(); app.attach(context); return app; } //Application的attach方法: /* package */ final void attach(Context context) { attachBaseContext(context); mLoadedApk = ContextImpl.getImpl(context).mPackageInfo; } 复制代码
先通过classLoader的loadClass(className)获取application的class,再通过clazz.newInstance()创建Application实例,接着调用app.attach(context)方法完成初始化。 Application的attach方法里是通过attachBaseContext(context), 把第一步创建的ContextImpl实例赋值给ContextWrapper的mBase成员变量。 到此Application实例创建就完成啦。
2.2 Activity创建为例
Activity创建和Application的创建类似,在ActivityThread的performLaunchActivity方法里
第一步:ActivityThread的performLaunchActivity方法
通过creatBaseContextForActivity方法创建ContextImpl实例,接着通过mInstrumentation.newActivity创建Activity实例,Activity实例通过classloader,加载className,调用clazz的newInstance方法创建。再接着调用activity.attach方法完成初始化。
第二步:Activity的attach方法
Activity的attach方法里是通过attachBaseContext(context), 把第一步创建的ContextImpl实例赋值给ContextWrapper的mBase成员变量。 到此Activity实例创建就完成啦。
2.3 Service创建为例
Service里的Context创建和Activity差不多
第一步:定位到ActivityThread的handleCreateService方法
java.lang.ClassLoader cl = packageInfo.getClassLoader(); service = (Service) cl.loadClass(data.info.name).newInstance(); ContextImpl context = ContextImpl.createAppContext(this, packageInfo); context.setOuterContext(service); Application app = packageInfo.makeApplication(false, mInstrumentation); service.attach(context, this, data.info.name, data.token, app, ActivityManager.getService()); service.onCreate(); 复制代码
调用ContextImpl的createAppContext()创建ContextImpl,调用setOuterContext()把service存储在ContextImpl的mOuterContext成员变量中,调用service.attach(),再调用service.onCreate()
第二步: Service的attach方法
public final void attach( Context context, ActivityThread thread, String className, IBinder token, Application application, Object activityManager) { attachBaseContext(context); mThread = thread; mClassName = className; mToken = token; mApplication = application; mActivityManager = (IActivityManager)activityManager; mStartCompatibility = getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.ECLAIR; } 复制代码
通过attachBaseContext(context), 把第一步创建的ContextImpl实例赋值给ContextWrapper的mBase成员变量。
以上所述就是小编给大家介绍的《Context真正的实现与Context设计模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 设计模式-享元设计模式
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Perl语言编程
克里斯蒂安森 (Tom Christiansen) (作者)、Brian D Foy (作者)、Larry Wall (作者)、Jon Orwant (作者) / 苏金国 (译者)、吴爽 (译者) / 中国电力出版社 / 2014-9-1 / 148
从1991年第一版问世以来,《Perl语言编程》很快成为无可争议的Perl宝典,如今仍是这种高实用性语言的权威指南。Perl最初只是作为一个功能强大的文本处理工具,不过很快发展成为一种通用的编程语言,可以帮助成千上万的程序员、系统管理员,以及像你一样的技术爱好者轻松完成工作。 人们早已经翘首以待这本“大骆驼书”的更新,如今终于得偿所愿。在这一版中,三位颇有声望的Perl作者讲述了这种语言当前......一起来看看 《Perl语言编程》 这本书的介绍吧!