Context 背景知识
android 是java编写的程序,那么Activity可以直接new出来吗?显然答案是不行的。android的应用模型是基于组件的应用模型,组件的运行需要Android的运行环境的,在这个环境下Activity、Service 等组件才能正常运行。Context可以理解位应用程序全局环境的接口,可以通过这个接口来获取应用程序的类和资源,Context是一个抽象类,android提供了这个抽象类的具体实现。如下图:
Context两个子类分工明确,ContextImpl是Context的具体实现类,ContextWrapper是Context的包装类,其最终的实现还是转到了ContextImpl来实现的。Application和Service是继承自ContextWrapper,Activity继承自ContextThemeWrapper(相比ContextWrapper它可以设置Theme),每次在创建一个Activity Service和Application实例对象的时候都会创建一个ContextImpl对象来负责实际的Context方法的处理。
Activity实现子类
这个问题本身意义并不大,从上面可以看出来,实现的子类主要有三个 Activity Service和Application。
Context能干什么
Context是上下文,它是获取应用环境的接口,因此它能获取应用程序的资源,例如启动四大组件,操作数据库等等。
Context的作用域
Activity作为Context是一个全能选手能够支持所有的跳转创建等操作。
1、如果Show Dialog,只有Activity支持创建这个涉及到窗口的相关知识,Dialog实际是一个子window,必须有一个父window。
2、如果在Application和Service里面startActivity,由于Application和Service 所生成的Context并没有Activity栈的相关信息,所以应该新建一个栈,并定义Activity栈位SingleTask。
3、Activity使用Layout Inflation,则会带上设定给Activity的相关主题,Application和Service则没有。
Context造成内存泄漏
Activity是Context的子类因此,如果内存泄漏会导致Activity一直无法gc。
如何避免呢?
1、当Application能够满足的情况下尽量使用Application。
2、不要用生命周期长的对象引用Activity。
3、在Activity不要使用非静态内部类,非静态内部类会持有外部类的引用。