`
CshBBrain
  • 浏览: 654922 次
  • 性别: Icon_minigender_1
  • 来自: 成都
博客专栏
B7d9bf34-126e-301f-819e-81f2615b5a2a
开源WebSocket服务...
浏览量:145960
Group-logo
HTML5移动开发
浏览量:138804
社区版块
存档分类
最新评论

Android Context 详解

 
阅读更多

转自:http://tech.ddvip.com/2013-01/1357303775188179.html

 

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

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

继承关系:

区别联系:

双击代码全选
1
2
3
4
5
6
7
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:

双击代码全选
1
2
3
4
5
6
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 类创建销毁它始终保存在内存中。

实现示例:

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
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`是一个至关重要的概念,它如同一个纽带,连接着应用的各个组成部分,如Service、BroadcastReceiver、Activity等。本文将深入剖析`Context`的内部机制,帮助...

    android中Context深入详解

    Android 中 Context 深入详解 Context 是 Android 中一个非常重要的概念,它是 Android 应用程序的核心组件之一。Context 提供了许多有用的方法和变量,用于访问应用程序的资源和组件。本文将深入探讨 Android 中 ...

    Android context源码详解及深入分析

    Android Context 是Android应用程序开发中的一个核心概念,它代表了应用程序的上下文环境,是一个与系统交互的关键接口。Context主要用于加载资源、启动Activity、获取系统服务、创建View等操作。在Android系统中,...

    Android面试复习资料大全(包含java源码)

    35. **Android Context详解**:深入解析Context的职责和如何在不同组件之间传递。 36. **Android进阶**:包括多线程断点续传、全局异常处理、MVP模式。 37. **Android性能优化总结**:详述内存泄漏、布局优化、...

    android adapter详解

    Android Adapter 详解 Android Adapter 是 Android 开发中一个重要的组件,负责将数据绑定到用户界面中。今天,我们将深入探讨 Android Adapter 的原理和实现方式。 什么是 Android Adapter? Android Adapter 是...

    Android全局获取Context实例详解

    Android全局获取Context实例详解 Android全局获取Context实例是Android开发中一个常见的问题。Context是Android中一个非常重要的概念,它提供了访问应用程序级别的资源和服务的能力。获取Context实例是非常必要的,...

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

    ### Android中上下文(context)用法详解 #### 一、Context基本概念 **Context** 是 Android 开发中一个非常核心且重要的概念。它提供了一系列方法来帮助开发者访问应用程序的各种资源和服务。 - **定义**: `...

    android优化技术详解

    Android 优化技术详解 Android 优化技术是指通过合理的编程和设计来提高 Android 应用程序的性能、内存和用户体验的一系列技术。下面是 Android 优化技术的详细解释: UI 布局优化 Android 的 UI 界面布局的优化...

    Android 中Context的使用方法详解

    Android 中Context的使用方法详解 Context 是 Android 中一个非常重要的概念,它提供了关于应用环境全局信息的接口,它是一个抽象类,它的执行被 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 ListView 详解 (文档)

    ### Android ListView 详解 在Android应用开发中,`ListView`是一种非常重要的UI组件,用于以列表形式展示数据。本文将详细介绍`ListView`的基本概念、如何使用不同类型的适配器(如`ArrayAdapter`、`SimpleAdapter...

    安卓Android Context类实例详解

    在Android开发中,Context类是应用的核心组成部分,它提供了与应用程序环境交互的接口。Context类在许多场景下被使用,包括创建UI元素、访问系统服务、读取资源以及执行其他与应用程序上下文相关的操作。本篇文章将...

    Android服务Service_详解.pdf

    开发者可以通过Context类的getSystemService()方法获取对应的系统服务实例。 在服务中更新GUI组件(图形用户界面组件)需要特别注意。因为Service运行在主线程之外,所以不能直接更新UI元素。如果需要在Service中...

    android的Fragment知识点详解

    ### Android的Fragment知识点详解 #### 一、Fragment概述 Fragment是一种可以嵌入到Activity中的UI片段,它可以被视为Activity的一部分,但具有自己的生命周期和输入事件。通过Fragment,开发者可以在同一个...

    Android的Window类详解

    ### Android的Window类详解 #### 一、概述 在Android开发过程中,`Window`类扮演着极其重要的角色,它是应用程序与用户交互的主要界面之一。本文将深入探讨Android系统的`Window`类,包括其属性和成员函数等内容。...

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

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

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

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

Global site tag (gtag.js) - Google Analytics