`
perfy315
  • 浏览: 414895 次
社区版块
存档分类
最新评论

理解Android的context

阅读更多
转:http://www.haogongju.net/art/1327662

Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system(added by me:By subclass). It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.

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。

1、两种类型的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等。

2、内存泄露
这样如果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不能正常被销毁。

3、为了防止内存泄露,我们应该注意以下几点:
不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的
对于生命周期长的对象,可以使用application context
避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化
application context
我们可以使用application context。application context伴随application的一生,与activity的生命周期无关。application context可以通过Context.getApplicationContext或者Activity.getApplication方法获取。
而制造Application context的方法在这里可以找到http://stackoverflow.com/questions/708012/android-how-to-declare-global-variables/708317#708317
Java里面通常是用一个static的变量(例如singleton之类的)来同步activity之间(程序里面类之间)的状态。在android里面比较靠谱的做法是用application context来关联这些状态。
每个activity都是context,里面包含了运行时的状态。同样application也有一个context,android会保证这个context是唯一的实例。
做一个你自己的application context需要继承android.app.Application,然后在app的manifest里面说明这个类。android会自动帮你创建你这个类的实例,接着你用Context.getApplicationContext()方法就能在各个activity里
面获得这个application context了。

class MyApp extends Application {

  private String myState;

  public String getState(){
    return myState;
  }
  public void setState(String s){
    myState = s;
  }
}

class Blah extends Activity {

  @Override
  public void onCreate(Bundle b){
    ...
    MyApp appState = ((MyApp)getApplicationContext());
    String state = appState.getState();
    ...
  }
}
分享到:
评论

相关推荐

    Android Context使用例子.

    `Context`的理解和正确使用对于编写健壮的Android应用至关重要。下面将详细介绍`Context`的基本概念、类型、常用方法以及在实际开发中的应用。 一、`Context`的基本概念 `Context`是Android框架中的一个基础类,它...

    android context理解

    ### Android Context深度解析 ...总之,`Context`在Android开发中扮演着至关重要的角色,正确理解和使用`Context`不仅能够提升应用的性能,还能有效避免常见的内存泄漏问题,确保应用的稳定性和效率。

    Android的context使用

    总结来说,理解并正确使用Context是Android开发中的关键。通过合理传递和管理Context,我们可以有效地进行组件交互和服务调用,从而构建出功能完善的Android应用程序。在实践中,应避免不必要的Context持有,遵循...

    谈谈Android里的Context的使用

    大家好,今天给大家分享一下Android里的Context的一些用法. 这里大致可以分为两种:一是传递Context参数,二是调用全局的Context. 其实我们应用启动的时候会启动Application这个类,这个类是在AndroidManifest.xml...

    Android Context与GetApplicationContext的区别及使用1

    【Android Context 与 GetApplicationContext 的区别及使用】 在Android开发中,Context是一个至关重要的概念,它扮演着应用程序组件与系统服务交互的关键角色。Context可以理解为应用运行时的上下文环境,提供了对...

    android中Context深入详解

    本文将深入探讨 Android 中 Context 的知识和继承关系,帮助读者更好地理解 Context。 1. Context 认知 Context 译为场景,一个应用程序可以认为是一个工作环境,在这个工作环境中可以存在许多场景,例如 coding ...

    012_android 之消息提示toast 和Context

    本教程“012_android 之消息提示toast 和Context”将深入讲解这两个关键知识点,帮助开发者更好地理解和运用它们。 首先,我们来谈谈Android中的消息提示Toast。Toast是一种轻量级的通知方式,它可以在屏幕上的任意...

    android Context Menu With Icon

    通过学习和理解这些代码,你将能够更好地掌握在Android中创建带有图标的`ContextMenu`的方法。 总之,`ContextMenu`在Android应用中提供了丰富的交互方式,通过适当的图标可以增强用户体验。通过注册、绑定和处理...

    android_context详解

    ### Android Context详解 在Android应用开发中,`Context`是一个至关重要的概念,它如同一个纽带,连接着应用的各个组成部分,如Service、BroadcastReceiver、Activity等。本文将深入剖析`Context`的内部机制,帮助...

    Android context源码详解及深入分析

    理解Context的含义和用法对于Android开发者来说至关重要,因为几乎所有的组件交互和系统服务调用都离不开它。通过深入学习和分析Context的源码,可以更深刻地了解Android系统的运行机制,提升开发能力。 总结来说,...

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

    在Android开发中,Context...总之,理解Context的作用和生命周期,以及在不同场景下如何正确使用,是避免Android内存泄露的关键。同时,保持良好的编程习惯,及时释放不再使用的资源,可以显著提升应用的性能和稳定性。

    android demo,BaseAdapter传递context的应用

    在Android开发中,`BaseAdapter`是一个非常关键的组件,它允许我们自定义ListView、GridView等控件的数据展示方式。...通过理解这些应用场景,我们可以更好地设计和实现自定义适配器,从而提高Android应用的用户体验。

    《深入理解Android》卷Ⅱ

    7.2.1 Context的getContentResolver函数分析 7.2.2 MediaStore.Image.Media的query函数分析 7.2.3 MediaProvider的启动及创建总结 7.3 SQLite创建数据库分析 7.3.1 SQLite及SQLiteDatabase家族 7.3.2 ...

    通过反射获取Context实例的Demo

    总的来说,理解反射和如何在Android中使用它是提高代码灵活性和解决问题的关键技能。然而,开发者应该谨慎使用,因为它可能会引入复杂性和潜在的问题。在能避免使用反射的情况下,尽量遵循最佳实践,以保持代码的...

    反射获取Context的实例

    `Context`是Android应用的基础组件,它提供了与系统交互的各种方法,如启动Activity、发送Broadcast、访问资源等。通常,我们可以在Activity、Service或Application中直接获取`Context`实例。然而,在非UI线程或...

    Android官方文档Context&Intent页保存

    首先,`Context`可以理解为Android系统的一个环境或者上下文,它提供了与应用程序运行环境交互的接口。`Context`主要包含了以下功能: 1. **资源访问**:通过`Context`,开发者可以访问应用的资源,如字符串、颜色...

    Android部分源码——content包

    理解并熟练运用这些知识点,对于开发能够高效、安全地与其他应用交换数据的Android应用至关重要。通过对这些源代码的学习,开发者不仅可以掌握Android系统的底层工作原理,还能提高编程技巧和解决问题的能力。

    在项目的任何地方轻松获取Context的demo

    总结起来,理解和合理利用Context对于提升Android应用的性能和稳定性至关重要。在项目中,我们应该尽量使用Application Context来处理非UI相关的任务,减少对Activity Context的依赖,同时利用依赖注入和现代开发...

    谈谈Android里的Context的使用实例

    本文将详细讲解如何在Android应用中正确使用和理解Context。 首先,让我们明确Context的几种类型: 1. **Activity Context**:通常由Activity类提供,它与用户界面直接关联。Activity Context可以用来启动新的...

    Android中上下文(context)用法详解

    ### Android中上下文(context)用法详解 ...理解 Context 的概念及其用法对于成为一名合格的 Android 开发者至关重要。通过掌握 Context 的各种用法,开发者可以更加高效地构建出功能丰富、用户体验良好的移动应用。

Global site tag (gtag.js) - Google Analytics