Android中Context的使用

Context字面意思上下文,位于framework package的android.content.Context中,其实该类为LONG型,类 似Win32中的Handle句柄,很多方法需要通过 Context才能识别调用者的实例,比如说Toast的第一个参数就是 Context,一般在Activity中我们直接用this代替,代表调用者的 实例为Activity,而到了一个button的 onClick(View view)等方法时,我们用this时就会报错,所以我们可能使用ActivityName.this来解决,主要 原因是因为实现Context的类主要有Android特有的几个模型,Activity、Service以及BroadcastReceiver。

Context提供了关于应用环境全局信息的接口。它是一个抽象类,它的执行被Android系统所提供。它 允许获取以应用为特征的资源和类型。同时启动应用级的操作,如启动Activity,broadcasting和接收 intents。

两种类型的Context

在android中context可以作很多操作,但是最主要的功能是加载和访问资源。在android中有两种context ,一种是 application context,一种是activity context,通常我们在各种类和方法间传递的是activity context。比如一个activity的onCreate

protected void onCreate(Bundle state) {
super.onCreate(state);  

TextView label = new TextView(this);
//传递context给view control  

label.setText("Leaks are bad");  

setContentView(label);
}

把activity context传递给view,意味着view拥有一个指向activity的引用,进而引用activity占有的资 源:view hierachy, resource等。

内存泄露

这样如果context发生内存泄露的话,就会泄露很多内存。这里泄露的意思是gc没有办法回收activity的内 存。

注释:为什么GC没有办法回收相应的内存,个人感觉是因为传递Context会增加对象指针的引用计数, 所以基于智能指针技术的GC无法释放相应的内存。

当屏幕旋转的时候,系统会销毁当前的activity,保存状态信息,再创建一个新的。比如我们写了一个应 用程序,它需要加载一个很大的图片,我们不希望每次旋转屏幕的时候都销毁这个图片,重新加载。实现这个 要求的简单想法就是定义一个静态的Drawable,这样Activity 类创建销毁它始终保存在内存中。实现类似:

public class myactivity extends Activity {
private static Drawable sBackground;
protected void onCreate(Bundle state) {
super.onCreate(state);  

TextView label = new TextView(this);
label.setText("Leaks are bad");  

if (sBackground == null) {
sBackground = getDrawable(R.drawable.large_bitmap);
}
label.setBackgroundDrawable(sBackground);//drawable attached to a view  

setContentView(label);
}
}

这段程序看起来很简单,但是却问题很大。当屏幕旋转的时候会有leak(即gc没法销毁activity)。我们 刚才说过,屏幕旋转的时候系统会销毁当前的activity。但是当drawable和view关联后,drawable保存了view 的 reference,即sBackground保存了label的引用,而label保存了activity的引用。既然drawable不能销毁 ,它所引用和间接引用的都不能销毁,这样系统就没有办法销毁当前的activity,于是造成了内存泄露。gc对 这种类型的内存泄露是无能为力的。避免这种内存泄露的方法是避免activity中的任何对象的生命周期长过 activity,避免由于对象对 activity的引用导致activity不能正常被销毁。

为了防止内存泄露,我们应该 注意以下几点:

不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期 是一样的

对于生命周期长的对象,可以使用application context

避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期 变化

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, 内存泄露
, leaks
, activity
, context
, label
, 内存泄露内存android
, 销毁对象
, 一个
, android中的context
, View回收
, android图片旋转
, 避免内存泄露
获取drawable
android中context详解、android中的context、android中context、android context、android getcontext,以便于您获取更多的相关知识。

时间: 2024-11-08 22:30:24

Android中Context的使用的相关文章

避免 Android中Context引起的内存泄露_Android

Context是我们在编写Android程序经常使用到的对象,意思为上下文对象. 常用的有Activity的Context还是有Application的Context.Activity用来展示活动界面,包含了很多的视图,而视图又含有图片,文字等资源.在Android中内存泄露很容易出现,而持有很多对象内存占用的Activity更加容易出现内存泄露,开发者需要特别注意这个问题. 本文讲介绍Android中Context,更具体的说是Activity内存泄露的情况,以及如何避免Activity内存泄

Android 中Context的使用方法详解

Android 中Context的使用方法详解 概要: Context字面意思是上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄.很多方法需要通过 Context才能识别调用者的实例:比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,代表调用者的实例为Activity,而到了一个button的onClick(View view)等方法时,我们用t

避免 Android中Context引起的内存泄露

Context是我们在编写Android程序经常使用到的对象,意思为上下文对象. 常用的有Activity的Context还是有Application的Context.Activity用来展示活动界面,包含了很多的视图,而视图又含有图片,文字等资源.在Android中内存泄露很容易出现,而持有很多对象内存占用的Activity更加容易出现内存泄露,开发者需要特别注意这个问题. 本文讲介绍Android中Context,更具体的说是Activity内存泄露的情况,以及如何避免Activity内存泄

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

        大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中    时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法 : 说它陌生,完全是    因为我们真正的不懂Context的原理.类结构关系.一个简单的问题是,一个应用程序App中存在多少个Context实例对象呢?    一个.两个? 在此先卖个关子吧.读了本文,相信您会豁然开朗的

详解Android中的Context抽象类_Android

关于Context我们首先应该知道: (1)它描述的是一个应用程序环境的信息,即上下文. (2)该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类(后面我们会讲到是ContextIml类). (3)通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent信息等.. 于是,我们可以利用该Context对象去构建应用级别操作(application-level operations) .一.Con

详解Android中的Context抽象类

关于Context我们首先应该知道: (1)它描述的是一个应用程序环境的信息,即上下文. (2)该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类(后面我们会讲到是ContextIml类). (3)通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent信息等.. 于是,我们可以利用该Context对象去构建应用级别操作(application-level operations) . 一.Co

Android中的ToDoList(定制样式) 详解

Android允许从已有的视图工具箱(Widget Tool Box)派生子类 或 实现自己的视图控件; 通过重写事件处理程序 和onDraw()方法, 但是仍然回调超类(super)的方法, 可以对视图进行定制, 而不必实心它的功能; 前置步骤参见: http://blog.csdn.net/caroline_wendy/article/details/21246963 步骤: 1. 创建ToDoListItemView类, 定制Item项的外观: 位置: java->package->To

Android中的Compass(罗盘) 详解

Compass(罗盘)是一个定制的视图, 继承View类, 重写了视图的边界(onMeasure)和内容(onDraw); 如图: 以下是Compass的具体设计: 1. 创建CompassView类, 罗盘视图 位置: java->package->CompassView package mzx.spike.compass.app; import android.content.Context; import android.content.res.Resources; import and

详解Android中Drawable方法_Android

本文为大家分享了Android中Drawable方法的详细使用方法,供大家参考,具体内容如下 1. BitmapDrawable相关方法: 新建在drawable目录下面,示例如下: <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:antialias="true" android:dither="true" android:filter=&