Context概念:从Android系统的角度来理解,Context是一个场景,代表与操作系统的交互的一种过程。从程序的角度上来理解,Context是个抽象类,而Activity、Service、Application等都是该类的一个实现,其通用实现在ContextImpl类中。它的主要作用是一个访问application环境全局信息的接口,通过它可以访问application的资源和相关的类。
创建Context实例的场景:
(1)创建Application 对象时, 而且整个App共一个Application对象
(2)创建Service对象时
(3)创建Activity对象时
Context的数量:Context数量=Activity数量+Service数量+1(Application)
获取Context的方法:
(1)View.getContext(),返回当前View对象的Context对象,通常是当前正在展示的Activity对象。
(2)Activity.getApplicationContext(),获取当前Activity所在的应用进程的Context对象,通常我们使用Context对象时,要优先考虑这个全局的进程Context。
(3)ContextWrapper.getBaseContext(),用来获取一个ContextWrapper进行装饰之前的Context,可以使用这个方法,这个方法在实际开发中使用并不多,不建议使用。
(4)Activity.this 返回当前的Activity实例,如果是UI控件需要使用Activity作为Context对象,但是默认的Toast实际上使用ApplicationContext也可以。
Context作用域:虽然Context的用途很广泛,但不是随便拿到一个Context实例就可以为所欲为,它的使用还是有一些规则限制的。在绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。
Context作用域
Context内存泄露问题:
(1)静态资源导致的内存泄漏。解决方案:避免使用静态资源,或者使用弱引用来解决相应。
(2)单例模式导致内存泄漏。解决方案:使用getApplicationContext(),这样使用单例与Activity就无关了,Activity释放的时候就不会出现内存泄露的问题了
寄语:人生若只如初见,何事秋风悲画扇?——纳兰容若《木兰辞·拟古决绝词柬友》
举报/反馈