在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的内存。
Leaking an entire activity是很容易的一件事。
当屏幕旋转的时候,系统会销毁当前的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不能正常被销毁。我们可以使用application context。application context伴随application的一生,与activity的生命周期无关。application context可以通过Context.getApplicationContext或者Activity.getApplication方法获取。
避免context相关的内存泄露,记住以下几点:
1. 不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的
2. 对于生命周期长的对象,可以使用application context
3. 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化
转载自:
http://liaowb1234.blog.163.com/blog/static/7715554720106911396569/
分享到:
相关推荐
总之,`Context`在Android开发中扮演着举足轻重的角色,理解和合理利用`Context`可以帮助我们编写出更加高效、稳定的应用程序。在实际开发中,需要根据具体需求选择合适的`Context`类型,并注意防止内存泄漏等问题。
在Android开发中,...通过合理传递和管理Context,我们可以有效地进行组件交互和服务调用,从而构建出功能完善的Android应用程序。在实践中,应避免不必要的Context持有,遵循最佳实践,以确保应用的稳定性和性能。
这里大致可以分为两种:一是传递Context参数,二是调用全局的Context. 其实我们应用启动的时候会启动Application这个类,这个类是在AndroidManifest.xml文件里其实是默认的 android:icon="@drawable/ic_...
简要介绍android context 的用法
在Android开发中,消息提示和上下文(Context)是两个非常基础且重要的概念。本教程“012_android 之消息提示toast 和Context”将深入讲解这两个关键知识点,帮助开发者更好地理解和运用它们。 首先,我们来谈谈...
【Android Context 与 ...正确选择和管理Context可以帮助我们构建更健壮、高效的Android应用程序。在实际开发中,应根据需求选择合适的Context类型,同时注意避免不必要的引用保持,以防止内存泄漏的发生。
Android全局变量和Context的实现方法
通过对 ContextImpl 对象的创建过程的深入了解,我们可以更好地理解 Android 中的 Context。 5. Context 的应用 Context 是 Android 中一个非常重要的组件,它提供了许多有用的方法和变量,用于访问应用程序的资源...
### Android Context详解 在Android应用开发中,`Context`是一个至关重要的概念,它如同一个纽带,连接着应用的各个组成部分,如Service、BroadcastReceiver、Activity等。本文将深入剖析`Context`的内部机制,帮助...
在Android中,如果我们有一个包含Context引用的对象(如Application或Activity),我们可以通过反射获取这个引用。 以下是一个简单的步骤来通过反射获取Context实例: 1. **获取类对象**:首先,我们需要知道哪个...
2. **资源访问**:`Context`提供对Android资源(如字符串、颜色、尺寸等)的访问,例如`context.getResources().getColor(colorRes)`或`context.getString(stringRes)`。在适配器中,我们可能需要根据资源ID获取相应...
`Context`是Android应用的基础组件,它提供了与系统交互的各种方法,如启动Activity、发送Broadcast、访问资源等。通常,我们可以在Activity、Service或Application中直接获取`Context`实例。然而,在非UI线程或...
### Android Context深度解析 在Android开发中,`Context`是一个至关重要的概念,它扮演着连接应用组件、系统服务以及资源的桥梁角色。本文将深入探讨`Context`在Android中的作用,以及如何正确使用以避免常见的...
需在AndroidManifest.xml文件的标签下进行指定: android:name="工具类的路径" 调用: Toast.makeText...不管你想在项目的任何地方使用Context,只需要调用一下MainApplication.getContext()就可以了
【Context-Menu.Android源码】是一个专门为Android平台设计的开源项目,主要目的是提供一个自定义上下文菜单(Context Menu)的实现。在Android系统中,上下文菜单通常用于响应长按事件,显示与选定项相关的操作选项...
在Android开发中,Context Menu是一种常见的用户交互设计,它允许用户在长按或者右键点击一个视图或控件时,弹出一个包含多个选项的菜单。本篇将深入探讨如何在Android应用中实现带有图标的Context Menu,以及相关的...
在Android开发中,Context是应用程序的核心组件之一,它提供了与Android系统交互的接口,使得开发者可以在应用程序的不同组件之间共享状态信息。"在项目的任何地方轻松获取Context的demo"旨在展示如何高效、安全地在...
2.什么是Context? Context中文意思是上下文,在小学语文课时,我们肯定接触过联系上下文理解词语的题目,“上下文”指的是语境,我们对语境的含义肯定是比较了解,一是小学刷那么多题目,二是现实生活中也常碰到,...
首先,`Context`可以理解为Android系统的一个环境或者上下文,它提供了与应用程序运行环境交互的接口。`Context`主要包含了以下功能: 1. **资源访问**:通过`Context`,开发者可以访问应用的资源,如字符串、颜色...
在 Android 应用开发中,**View** 与 **Context**(或 **Activity**)之间的关系可以形象地比喻为明星与经纪人之间的关系。创建 View 时,必须明确指定其 Context,否则该 View 将无法正常工作。这是因为 View 需要...