android中Context的应用总结

概述

作为一名Android开发人员,每天使用最多的类中,恐怕Context可以排的上一号了。因为Context对象在我们的项目中实在是太常见了,我们在加载资源,启动Activity,获取Service,发送Broadcast,创建View时都需要Context的参与。总之,Context是为一个Android程序提供各种功能,资源,服务的一个环境,Context的资源在系统中只有一套,因为它的子类(Application,Activity,Service)对这同一块资源处理方式的不同,让Context对象在功能上表现出各自之间的差异。

保存Context引用

在编写工具类时,我们经常会编写成单例的模式,而这些工具类大都会访问资源,也就是说需要Context的参与。这时就会涉及到Context的引用问题。比如下面工具类的写法:

public class Util {

private Context context;

private static Util util;

private Util(Context  context){

this.context = context;

}

public static Util getInstance(Context context){

if(null == util){

synchronized (Util.class) {

if(null == util){

util = new Util(context);

}

}

}

return util;

}

}

上面的工具类中,使用单例模式,内部保存了一个Context引用,表面上看这样的写法是没有问题的,但是实际应用中可能会造成内存的泄露。因为我们不能够确定传入的Context来自哪里,如果是在某个Activity中,直接传入的是this,这时这个Util类中是一个static修饰且强引用的是常驻内存的,它内部会一直持有这个Activity作为Context引用,这就会导致即使这个Activity被销毁掉,这个Activity还是没有办法进行内存回收。所以就造成了内存泄漏。

为了避免上面的问题,我们可以对getInstance方法进行优化,如下:

public static Util getInstance(Context context){

if(null == util){

synchronized (Util.class) {

if(null == util){

util = new Util(context.getApplicationContext());

}

}

}

return util;

}

采用上面的方式可以理解为引用的是ApplicationContext,它的生命周期与单例对象一致,只要这个应用还在运行这个Context就会一直存在。所以说当Application的Context能解决的情况下,优先使用Application的Context,这样能避免内存泄漏。

Context的应用场景

但是上面的解决方案并不是万能的,在涉及到UI加载操作,启动Activity等,使用Application的Context时,程序无法运行的。这主要是因为Activity和Application所代表的Context返回的不是同一个对象,它们各自的使用场景也是不同的。下面是它们各自的使用场景,可以进行比较。

大家注意看到有一些NO上添加了一些数字,其实这些从能力上来说是YES,但是为什么说是NO呢?下面一个一个解释:

数字1:启动Activity在这些类中是可以的,但是需要创建一个新的task。一般情况不推荐。

数字2:在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用。

数字3:在receiver为null时允许,在4.2或以上的版本中,用于获取黏性广播的当前值。(可以无视)

注:ContentProvider、BroadcastReceiver之所以在上述表格中,是因为在其内部方法中都有一个context用于使用。

从上面的表格中可以看出,和UI相关的方法都不可使用Application,都应该使用Activity作为Context来处理;然后再配合工具类中Context引用的持有,防止内存泄漏,这是便能达到好的应用效果。

时间: 2024-10-07 11:07:33

android中Context的应用总结的相关文章

Android中Context详解 ---- 你所不知道的Context

转载至 :http://blog.csdn.net/qinjuning 前言:本文是我读<Android内核剖析>第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书. 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法 : 说它陌生,完全是 因为我们真正的不懂Context

Android中Context详解 ---- 你所不知道的Context (转载)

Android中Context详解 ---- 你所不知道的Context (转载) http://blog.csdn.net/qinjuning 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法 : 说它陌生,完全是 因为我们真正的不懂Context的原理.类结构关系.一个简单的问题是,一个应用

Android中Context详解 ---- 你所不知道的Context(转)

Android中Context详解 ---- 你所不知道的Context(转)                                              本文出处 :http://blog.csdn.net/qinjuning 前言:本文是我读<Android内核剖析>第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书. 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打

Android中Context的总结及其用法

在语句 android中我们经常遇到这样的情况,在创建一个对象的时候往往需要传递一个this参数,比如:语句 MyView mView = new MyView(this),要求传递一个this参数,这个this究竟指的是什么东西呢? 其实这里的this指的就是当前的Activity.this,是这个语句所在的Activity的this.Activity.this取的是这个Activity的Context,那么这个Context究竟是什么东西呢?它起到什么作用呢? Context 按照英文字面意

Android中Context的理解与使用技巧

Context类,时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法. 但是不懂Context的原理.类结构关系.一个简单的问题是,一个应用程序App中存在多少个Context实例对象呢? Context,中文直译为"上下文",SDK中对其说明如下: Interface to global information about an application environment. This is an ab

【三】6.Android 中 Context 的理解及使用

[一]Context的作用:访问全局信息 Context是访问全局信息的接口,比如说应用程序的资源(图片资源.字符串资源.其他资源...), 所以一些常用组件就会继承Context,目的就是为了访问资源,比如说Activity以及将要学习的Service. 创建项目来看下如何通过Context进行资源的访问. public class MainActivity extends Activity{     private TextView tv;          @Override     pr

Android中Context解析

Context概念 当我们访问当前应用的资源,启动一个新的activity的时候都需要提供Context. Context是一个抽象基类,我们通过它访问当前包的资源(getResources.getAssets)和启动其他组件(Activity.Service.Broadcast)以及得到各种服务(getSystemService),当然,通过Context能得到的不仅仅只有上述这些内容.对Context的理解可以来说:Context提供了一个应用的运行环境,在Context的大环境里,应用才可

Android中Context详解

Context,中文直译为“上下文”,SDK中对其说明如下: Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well

Android中Context具体解释 ---- 你所不知道的Context

                                                                                                                                    本文原创 ,转载必须注明出处 :http://blog.csdn.net/qinjuning 前言:本文是我读<Android内核剖析>第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书. 大家好,  今天给大家