在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. 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化
分享到:
相关推荐
### Android Context深度解析 ...总之,`Context`在Android开发中扮演着至关重要的角色,正确理解和使用`Context`不仅能够提升应用的性能,还能有效避免常见的内存泄漏问题,确保应用的稳定性和效率。
`Context`的理解和正确使用对于编写健壮的Android应用至关重要。下面将详细介绍`Context`的基本概念、类型、常用方法以及在实际开发中的应用。 一、`Context`的基本概念 `Context`是Android框架中的一个基础类,它...
简要介绍android context 的用法
总结来说,理解并正确使用Context是Android开发中的关键。通过合理传递和管理Context,我们可以有效地进行组件交互和服务调用,从而构建出功能完善的Android应用程序。在实践中,应避免不必要的Context持有,遵循...
大家好,今天给大家分享一下Android里的Context的一些用法. 这里大致可以分为两种:一是传递Context参数,二是调用全局的Context. 其实我们应用启动的时候会启动Application这个类,这个类是在AndroidManifest.xml...
【Android Context 与 GetApplicationContext 的区别及使用】 在Android开发中,Context是一个至关重要的概念,它扮演着应用程序组件与系统服务交互的关键角色。Context可以理解为应用运行时的上下文环境,提供了对...
Android全局变量和Context的实现方法
本教程“012_android 之消息提示toast 和Context”将深入讲解这两个关键知识点,帮助开发者更好地理解和运用它们。 首先,我们来谈谈Android中的消息提示Toast。Toast是一种轻量级的通知方式,它可以在屏幕上的任意...
本文将深入探讨 Android 中 Context 的知识和继承关系,帮助读者更好地理解 Context。 1. Context 认知 Context 译为场景,一个应用程序可以认为是一个工作环境,在这个工作环境中可以存在许多场景,例如 coding ...
通过学习和理解这些代码,你将能够更好地掌握在Android中创建带有图标的`ContextMenu`的方法。 总之,`ContextMenu`在Android应用中提供了丰富的交互方式,通过适当的图标可以增强用户体验。通过注册、绑定和处理...
### Android Context详解 在Android应用开发中,`Context`是一个至关重要的概念,它如同一个纽带,连接着应用的各个组成部分,如Service、BroadcastReceiver、Activity等。本文将深入剖析`Context`的内部机制,帮助...
Android Context PPT,study
android:name="工具类的路径" 调用: Toast.makeText(MainApplication.getContext(), "文本", Toast.LENGTH_SHORT).show(); 不管你想在项目的任何地方使用Context,只需要调用一下MainApplication.getContext()...
理解Context的含义和用法对于Android开发者来说至关重要,因为几乎所有的组件交互和系统服务调用都离不开它。通过深入学习和分析Context的源码,可以更深刻地了解Android系统的运行机制,提升开发能力。 总结来说,...
在Android开发中,`BaseAdapter`是一个非常关键的组件,它允许我们自定义ListView、GridView等控件的数据展示方式。...通过理解这些应用场景,我们可以更好地设计和实现自定义适配器,从而提高Android应用的用户体验。
在Android开发中,Context...总之,理解Context的作用和生命周期,以及在不同场景下如何正确使用,是避免Android内存泄露的关键。同时,保持良好的编程习惯,及时释放不再使用的资源,可以显著提升应用的性能和稳定性。
总的来说,理解反射和如何在Android中使用它是提高代码灵活性和解决问题的关键技能。然而,开发者应该谨慎使用,因为它可能会引入复杂性和潜在的问题。在能避免使用反射的情况下,尽量遵循最佳实践,以保持代码的...
【Context-Menu.Android源码】是一个专门为Android平台设计的开源项目,主要目的是提供一个自定义上下文菜单(Context Menu)的实现。在Android系统中,上下文菜单通常用于响应长按事件,显示与选定项相关的操作选项...
`Context`是Android应用的基础组件,它提供了与系统交互的各种方法,如启动Activity、发送Broadcast、访问资源等。通常,我们可以在Activity、Service或Application中直接获取`Context`实例。然而,在非UI线程或...
首先,`Context`可以理解为Android系统的一个环境或者上下文,它提供了与应用程序运行环境交互的接口。`Context`主要包含了以下功能: 1. **资源访问**:通过`Context`,开发者可以访问应用的资源,如字符串、颜色...