`
nanjingjiangbiao_T
  • 浏览: 2599751 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android Context 详解

 
阅读更多

Android中context可以作很多操作,但是最主要的功能是加载和访问资源。

在android中有两种context,一种是application context,一种是activity context,通常我们在各种类和方法间传递的是activity context。


继承关系:



区别联系:

public class MyActivity extends Activity {
    public void method() {
       mContext = this;    // since Activity extends Context
       mContext = getApplicationContext();
       mContext = getBaseContext();
    }
 }
this 是Activity 的实例,扩展了Context,其生命周期是Activity 创建到销毁
getApplicationContext()返回应用的上下文,生命周期是整个应用,应用摧毁它才摧毁
Activity.this的context返回当前activity的上下文,属于activity ,activity 摧毁他就摧毁
getBaseContext()返回由构造函数指定或setBaseContext()设置的上下文,SDK文档很少,不推荐使用

搞清楚了生命周期就会在使用过程中犯错误,比如有一个全局的数据操作类用到了context,这个时候就要用到getApplicationContext 而不是用ACtivity,这就保证了数据库的操作与activity无关(不会一直引用Activity的资源,防止内存泄漏)


应用场景:
比如一个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,保存状态信息,再创建一个新的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.getApplicationContext()方法获取。


避免context相关的内存泄露,记住以下几点:

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

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

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



参考推荐:

Android程序里面传Context对象


分享到:
评论

相关推荐

    android_context详解

    android_context详解,深入剖析

    Android context源码详解及深入分析

    Android context详解 前言: Context都没弄明白,还怎么做Android开发? Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用...

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

    Context用法详解

    Android全局获取Context实例详解

    主要介绍了Android全局获取Context实例详解的相关资料,需要的朋友可以参考下

    leetcode安卓-android_interview:android_interview

    leetcode安卓 Android校招面试指南 Java Android 数据结构 算法 设计模式 计算机网络 操作系统 ...Context详解 HELLO丶GUY Fragment详解 Shawon Android推送技术 徐凯强Andy 动态规划 aaronice LeetCode

    leetcode安卓-NPS_Android:NPS_Android

    leetcode安卓 Android校招面试指南 Java Android 数据结构 算法 设计模式 计算机网络 操作系统 ...Context详解 HELLO丶GUY Fragment详解 Shawon Android推送技术 徐凯强Andy 动态规划 aaronice LeetCode

    Android 中Context的使用方法详解

    主要介绍了Android 中Context的使用方法详解的相关资料,希望通过本文大家能够理解掌握context的使用方法,需要的朋友可以参考下

    安卓Android Context类实例详解

    在开发Android的过程中,总是能遇见Context类或者它的实例.Context类的实例经常被用来提供“应用程序”的引用,下面举例说明Contex类实例详解

    Android编程中context及全局变量实例详解

    本文实例讲述了Android编程中context及全局变量的用法。分享给大家供大家参考,具体如下: 今天在研究context的时候,对application和activity context有了一定的了解,下面是从网上复制过来的资料 Application ...

    leetcode安卓-learnAndroid:只为学习安卓!~~

    leetcode安卓 Android校招面试指南 Java Android 数据结构 算法 设计模式 计算机网络 操作系统 ...Context详解 HELLO丶GUY Fragment详解 Shawon Android推送技术 徐凯强Andy 动态规划 aaronice LeetCode

    android中Context深入详解

    以下分别通过Context认知角度,继承关系,对象创建等方面android中Context做了深入的解释,一起学习下。 1、Context认知。 Context译为场景,一个应用程序可以认为是一个工作环境,在这个工作环境中可以存在许多场景...

    android基础教程之context使用详解

    在android中有两种context,一种是application context,一种是activity context,通常我们在各种类和方法间传递的是activity context。 区别联系: 代码如下:public class MyActivity extends Activity { public ...

    详解Android中的Context抽象类

    主要介绍了Android中的Context抽象类,包括Context的实例化与获取App的Context等方法,需要的朋友可以参考下

    Android编程实现全局获取Context及使用Intent传递对象的方法详解

    本文实例讲述了Android编程实现全局获取Context及使用Intent传递对象的方法。分享给大家供大家参考,具体如下: 一、全局获取 Context Android 开发中很多地方需要用到 Context,比如弹出 Toast、启动活动、发送广播...

Global site tag (gtag.js) - Google Analytics