1.应用里有多少个Context?不同的Context之间有什么区别?
2.Activity里的this和getBaseContext有什么区别?
3.getApplication和getApplicationContext有什么区别?
4.应用组件的构造、onCreate、attachBaseContext调用顺序?
Context是一个抽象类,它的实现类是ContextImpl。它定义了一堆抽象函数,比如获取系统资源的,获取系统服务的,启动Activity的,发送广播的等。。
Application、Activity、Service是有自己的Context的,广播和ContentProvider是没有自己的Context的。
Application的Context其实就是new ContextImpl(...)对象然后赋给Application,Activity,Service的Context其实也一样
广播的onReceive里的context是哪里来的?
如果是动态注册的话就是注册广播时的用的context,如果是静态注册的话是以Application为mBase的ContentWrapper。
ContentProvider里面有一个mContext的成员变量,是它初始化时外部传入的Application的context,ContentProvider的初始化虽然是在Application的构造函数以及attachBaseContext之后,但是它是在Application的onCreate之前调用的,也就是说ContentProvider的onCreate要比Application的onCreate提前调的。
context的个数是进程中的Application,Activity,Service的总和,应用也可能是多进程的Application可能有多个,不同的是Activity因为要显示UI,它继承的是ContextThemeWrapper,而Application和Service继承的是ContextWrapper。
Activity自己继承的就是Context的,所以this就是返回Activity自己,而getBaseContext返回的是ContextWrapper里的mBase.。
getApplicationContext它是Context里的抽象函数,而getApplication是Activity和Service里特有的,它们返回的都是Application对象,它们的调用范围不一样,就好比你在广播里没法调用getApplication一样。
网友评论