很多初入Android开发的网友向我们问到Context有什么作用,很多地方都用到它,这里Android123给这些新入门的网友做个简单的解释:
Context字面意思上下文,位于framework package的androidcontentContext中,其实该类为LONG型,类似Win32中的Handle句柄,很多方法需要通过Context才能识别调用者的实例,比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,代表调用者的实例为Activity,而到了一个button的onClick(View view)等方法时,我们用this时就会报错,所以我们可能使用ActivityNamethis来解决,主要原因是因为实现Context的类主要有Android特有的几个模型,Activity、Service以及BroadcastReceiver。
常规需要Context实例的方法主要有各种Service实现的类,比如说SensorManager在实例化时需要getSystemService(String)方法就必须由Context的实例执行,还有一些私有的文件系统I/O比如说openFileInput以及常用的Toast的makeText方法。
相信很多人都知道是这样计算的,那到底为什么是这样呢?
源码分析基于Android28源码
什么是Context呢?可以理解为上下文、运行环境,当需要获取资源、系统服务以及启动Activity、Service用到,也可以通过它跟系统交互。
通过以下继承关系可以看出,Activity是继承ContextWrapper
ContextWrapper内部有一个Context类型的成员变量mBase
mBase是通过attachBaseContext()方法赋值
是创建Activity的关键,
主要工作
(1)createBaseContextForActivity()内部实例化ContextImpl 对象;
(2)mInstrumentationnewActivity()内部通过反射实例化Activity对象;
(3)activityattach()内部会调用attachBaseContext()方法给mBase对象赋值;
通过以下继承关系可以看出,Application是继承ContextWrappe
是创建Application的关键,
主要工作:
(1)ContextImplcreateAppContext()实例化ContextImpl ;
(2)mActivityThreadmInstrumentationnewApplication(),内部通过反射实例化Application,并把appContext传递过去,通过attach()方法给mBase赋值;
跟Activity类似就不再做分析。
经过分析发现:
1每个Activity,Service,Application都有一个ContextImpl 类型的成员变量mBase,ContextImpl是Context的实现类。
2细心的读者可能发现,Activity,Service,Application都是继承Context,其实他们本身是一个Context,也都实现了Context的抽象方法,
那么一个Activity是否就拥有两个Context呢
是不是
这样计算比较合适呢?
下面看下Context中常用的三个方法,
ContextImpl继承Context,并实现了这三个方法,
Activity间接继承Context,主要是在ContextWrapper实现了以上三个方法,从源码中可以看出,最终还是调用了ContextImpl的实现。
下图可以看出这几个的关系,ContextWrapper顾名思义就是Context的包装类(有ContextImpl的成员变量),并且实现了Context,这是一种装饰者设计模式。当在Activity中调用getAsset()时,其实最终是调用mBase的getAsset()。
Activity间接继承了Context,是为了拥有跟ContextImpl一样的功能,但真正起作用的是mBase这个成员变量,所以一个Activity其实就只有一个Context起作用,那就是ContextImpl类型的mBase。
这种计算方法应该是没有问题呢。
或许有人有这样的疑问,一个应用不是只有一个Application吗,为什么计算公式是加上Application个数?单进程应用来说,一个应用确实只有一个Application,而多进程应用,那么一个应用就有多个Application,所以应该说一个应用有一个或多个Application,一个进程有一个Application。
另外其他关于Context的常见面试题
1Activity的this跟getBaseContext区别。
前者是Activity对象本身,后者是通过attachBaseContext传入的ContextImpl对象mBase,两者功能是一样的,通过this最终还是会调到mBase对象中。
2getApplication和geApplicationContext区别。
两者都是返回Application对象,前者是Activity和Service里面的方法,后者是Context中定义的方法。
3应用组件的构造,onCreate、attachBaseContext的执行顺序。
先是组件构造化,接着attachBaseContext,传入ContextImpl对象,最后是onCreate方法。
4谈谈你对Context的理解
先是Context的作用,然后是有几种Context,Application、Service、Activity的Context有什么区别以及继承关系,
最后是mBase变量是如何实例化的。
以上分析有不对的地方,请指出,互相学习,谢谢哦!
2在Fragment中的使用方式则为:
1getActivity();//获取包含该fragment的活动(activity)上下文
2getContext();//获取该fragment上下文
3getActivity()getApplicationContext();//通过包含该fragment的活动(activity)获取整个应用的上下文
4getContext()getApplicationContext();//通过该fragment获取整个应用的上下文
和Activty中一样用就行了,Context是Activity 的基类
javalangObject
↳ androidcontentContext
↳ androidcontentContextWrapper
↳ androidviewContextThemeWrapper
↳ androidappActivity
以上就是关于android如何传context全部的内容,包括:android如何传context、源码分析->一个应用到底有几个Context、如何在Fragment中获取context等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)