Android中的context
参考:https://www.jianshu.com/p/94e0f9ab3f1d
Activity mActivity =new Activity()
Activity mActivity =new Activity()
Activity可以new吗?不能。
Android程序不像Java程序一样,随便创建一个类,写个main()方法就能运行;
Android应用模型是基于组件的应用设计模式,组件的运行要有一个各自特定的Context环境,在这个Context环境下,Activity、Service等组件才能正常工作。
这些组件并不能采用普通的Java new的方式 创建对象实例。
通俗理解Context
可以将Context理解为“场景”
一个Android应用程序,可以类比为一部电影,Activity,Service,Broadcast Receiver,Content Provider这四大组件就好比是这部戏里的四个主角:胡歌,霍建华,诗诗,Baby。他们是由剧组(系统)一开始就定好了的,所以这四位主角并不是大街上随随便便拉个人(new 一个对象)都能演的。
演员必须工作在镜头(Context)下,也就是说四大组件(四位主角)必须工作在Context环境下(摄像机镜头下)。
而Button,TextView,LinearLayout这些控件,就好比是这部戏里的群众演员,他们显然没有这么重要,随便一个路人甲路人乙都能演(可以new一个对象),但是他们也必须要面对镜头(工作在Context环境下),所以Button mButton=new Button(Context)
是可以的。
一个应用程序有几个Context
![图片名称](https://i-blog.csdnimg.cn/blog_migrate/390bf95d1ab0e109677d8d3fa458e35d.png)
Context的两个子类分工明确,
其中ContextImpl是Context的具体实现类,
ContextWrapper是Context的包装类。
Activity,Application,Service虽都继承自ContextWrapper(Activity继承自ContextWrapper的子类ContextThemeWrapper),但它们初始化的过程中都会创建ContextImpl对象,由ContextImpl实现Context中的方法。
从上面的关系图可以看出,在应用程序中Context的具体实现子类就是:Activity,Service,Application。那么Context数量=Activity数量+Service数量+1
。
可能会有疑问:我们常说的四大组件,这里怎么只有Activity和Service持有Context,那Broadcast Receiver和Content Provider呢?Broadcast Receiver,Content Provider并不是Context的子类,他们所持有的Context,都是其他地方传过去的,所以并不计入Context总数。
上面的关系图,也从侧面告诉我们,Context类在整个Android系统中的地位是多么的崇高,因为Activity,Service,Application都是其子类。