Android Context 上下文 你必须知道的一切

2023-11-08

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40481055,本文出自:【张鸿洋的博客

本文大多数内容翻译自:http://www.doubleencore.com/2013/06/context/  我重新组织了下内容以及结构,建议大家尽可能看下原文。


1、Context概念

其实一直想写一篇关于Context的文章,但是又怕技术不如而误人子弟,于是参考了些资料,今天准备整理下写出来,如有不足,请指出,参考资料会在醒目地方标明。

Context,相信不管是第一天开发Android,还是开发Android的各种老鸟,对于Context的使用一定不陌生~~你在加载资源、启动一个新的Activity、获取系统服务、获取内部文件(夹)路径、创建View操作时等都需要Context的参与,可见Context的常见性。大家可能会问到底什么是Context,Context字面意思上下文,或者叫做场景,也就是用户与操作系统操作的一个过程,比如你打电话,场景包括电话程序对应的界面,以及隐藏在背后的数据;

但是在程序的角度Context又是什么呢?在程序的角度,我们可以有比较权威的答案,Context是个抽象类,我们可以直接通过看其类结构来说明答案:


可以看到Activity、Service、Application都是Context的子类;

也就是说,Android系统的角度来理解:Context是一个场景,代表与操作系统的交互的一种过程。从程序的角度上来理解:Context是个抽象类,而Activity、Service、Application等都是该类的一个实现。

在仔细看一下上图:Activity、Service、Application都是继承自ContextWrapper,而ContextWrapper内部会包含一个base context,由这个base context去实现了绝大多数的方法。

先扯这么多,有能力了会从别的角度去审视Context,加油~


2、Context与ApplicationContext

看了标题,千万不要被误解,ApplicationContext并没有这个类,其实更应该叫做:Activity与Application在作为Context时的区别。嗯,的确是这样的,大家在需要Context的时候,如果是在Activity中,大多直接传个this,当在匿名内部类的时候,因为this不能用,需要写XXXActivity.this,很多哥们会偷懒,直接就来个getApplicationContext。那么大家有没有想过,XXXActivity.this和getApplicationContext的区别呢?

XXXActivity和getApplicationContext返回的肯定不是一个对象,一个是当前Activity的实例,一个是项目的Application的实例。既然区别这么明显,那么各自的使用场景肯定不同,乱使用可能会带来一些问题。

下面开始介绍在使用Context时,需要注意的问题。


3、引用的保持

大家在编写一些类时,例如工具类,可能会编写成单例的方式,这些工具类大多需要去访问资源,也就说需要Context的参与。

在这样的情况下,就需要注意Context的引用问题。

例如以下的写法:

[java]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. package com.mooc.shader.roundimageview;  
  2.   
  3. import android.content.Context;  
  4.   
  5. public class CustomManager  
  6. {  
  7.     private static CustomManager sInstance;  
  8.     private Context mContext;  
  9.   
  10.     private CustomManager(Context context)  
  11.     {  
  12.         this.mContext = context;  
  13.     }  
  14.   
  15.     public static synchronized CustomManager getInstance(Context context)  
  16.     {  
  17.         if (sInstance == null)  
  18.         {  
  19.             sInstance = new CustomManager(context);  
  20.         }  
  21.         return sInstance;  
  22.     }  
  23.       
  24.     //some methods   
  25.     private void someOtherMethodNeedContext()  
  26.     {  
  27.           
  28.     }  
  29. }  

对于上述的单例,大家应该都不陌生(请别计较getInstance的效率问题),内部保持了一个Context的引用;

这么写是没有问题的,问题在于,这个Context哪来的我们不能确定,很大的可能性,你在某个Activity里面为了方便,直接传了个this;这样问题就来了,我们的这个类中的sInstance是一个static且强引用的,在其内部引用了一个Activity作为Context,也就是说,我们的这个Activity只要我们的项目活着,就没有办法进行内存回收。而我们的Activity的生命周期肯定没这么长,所以造成了内存泄漏。

那么,我们如何才能避免这样的问题呢?

有人会说,我们可以软引用,嗯,软引用,假如被回收了,你不怕NullPointException么。

把上述代码做下修改:

[java]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. public static synchronized CustomManager getInstance(Context context)  
  2.     {  
  3.         if (sInstance == null)  
  4.         {  
  5.             sInstance = new CustomManager(context.getApplicationContext());  
  6.         }  
  7.         return sInstance;  
  8.     }  

这样,我们就解决了内存泄漏的问题,因为我们引用的是一个ApplicationContext,它的生命周期和我们的单例对象一致。

这样的话,可能有人会说,早说嘛,那我们以后都这么用不就行了,很遗憾的说,不行。上面我们已经说过,Context和Application Context的区别是很大的,也就是说,他们的应用场景(你也可以认为是能力)是不同的,并非所有Activity为Context的场景,Application Context都能搞定。

下面就开始介绍各种Context的应用场景。


4、Context的应用场景



大家注意看到有一些NO上添加了一些数字,其实这些从能力上来说是YES,但是为什么说是NO呢?下面一个一个解释:

数字1:启动Activity在这些类中是可以的,但是需要创建一个新的task。一般情况不推荐。

数字2:在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用。

数字3:在receiver为null时允许,在4.2或以上的版本中,用于获取黏性广播的当前值。(可以无视)

注:ContentProvider、BroadcastReceiver之所以在上述表格中,是因为在其内部方法中都有一个context用于使用。


好了,这里我们看下表格,重点看Activity和Application,可以看到,和UI相关的方法基本都不建议或者不可使用Application,并且,前三个操作基本不可能在Application中出现。实际上,只要把握住一点,凡是跟UI相关的,都应该使用Activity做为Context来处理;其他的一些操作,Service,Activity,Application等实例都可以,当然了,注意Context引用的持有,防止内存泄漏。


5、总结

好了,到此,Context的分析基本完成了,希望大家在以后的使用过程中,能够稍微考虑下,这里使用Activity合适吗?会不会造成内存泄漏?这里传入Application work吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Context 上下文 你必须知道的一切 的相关文章

随机推荐

  • 干货分享

    作为一个拥有强劲上进心的程序员 一个励志走向职场巅峰的IT精英 自我提升的平台与机会实在是太重要了 那么问题来了 学技术 卖代码 向大牛们讨经验 寻找项目机会哪家强 小编结合网上资源 吐血整理了一些程序员必逛的国内外网站 不好用你来打我 先
  • 10 大深度学习架构:计算机视觉优秀从业者必备(附代码实现)

    近日 Faizan Shaikh 在 Analytics Vidhya 发表了一篇题为 10 Advanced Deep Learning Architectures Data Scientists Should Know 的文章 总结了计
  • Only one connection receive subscriber allowed.

    这个filter 中报Only one connection receive subscriber allowed 主要是body体为null的情况 Component public class DecryptionFilter imple
  • 【图床搭建】腾讯云COS+PicGo+Typora图床搭建

    图床搭建 腾讯云COS PicGo Typora图床搭建 今天手把手教大家配置一个属于自己的图床 让大家发布在网络中的博客图片也可以被访问 保姆级教学 包教包会 腾讯云COS 1 开通COS 进入腾讯云官网控制台搜索对象存储 腾讯云 产业智
  • C++ 图像处理 之 亮度、色彩平衡调整(逼近PS法)

    C 图像处理 之 亮度 色彩平衡调整 逼近PS法 关键词 图像处理亮度调整 色彩平衡Photoshop 参考博客 http blog csdn net maozefa article details 4493395 http www cnb
  • Shell编程实战

    题目要求 设计一个shell程序计算n的阶乘 要求 1 从命令行接收参数n 2 在程序开始后立即判断n的合法性 即是否有参数 若有是否为正整数 若非法请 给错误提示 3 最后输出计算的结果 考察 if结构 while循环 难点 1 判断参数
  • python报'DataFrame' object has no attribute 'as_matrix'错误

    在python中报错 DataFrame object has no attribute as matrix 解决办法 https pandas pydata org pandas docs stable search html q as
  • JSON中 $ref 的用法

    JSON中 ref 的用法 It is a keyword you can use to refer and reuse schemas 是用来引用 重复使用schema Schema type object title A Non emp
  • 100天精通Python(基础篇)——第5天:数据类型转换

    文章目录 一 字符串 整数 浮点数类型转换的语句 二 数字转字符串 三 字符串转数字 四 整数和浮点数互转 一 字符串 整数 浮点数类型转换的语句 二 数字转字符串 num str str 11 print type num str num
  • mysql下载 补丁_mysql 官方补丁在哪里下载?

    MySQL 64位安装图解 解压缩后运行程序开始安装 选择接受协议 点击下一步 选择developer default 点击 next 检查是否满足安装需求 点击 Execute 按钮后 可能会下载一些程序 到时你自己点击安装就行了 直到所
  • 区块链架构-fabric集群版安装(centos7版本)

    书接上回 配置多机器多节点集群模式 服务器选择说明 暂不考虑高可用 也不考虑kafka 所以先使用三台机器 3M 3台服务器 1O 1 Order 2P 2 Org2Peer 3 1 2证书加密 证书与加密暂时不采用CA 直接使用官方提供的
  • Ai实现FPS游戏自动瞄准 yolov5fps自瞄

    大家好 我是毕加锁 锁 今天来分享一个Yolov5 FPS跟枪的源码解析和原理讲解 代码比较粗糙 各位有什么优化的方式可以留言指出 可以一起交流学习 需要了解的东西和可能会遇到的问题1 xy坐标点与当前鼠标的xy坐标点距离计算 2 获取窗口
  • 两个串口之间传输文件

    一 串口连接 将两个USB TO TTL用两根杜邦线连接 将两个USB TO TTL的RX TX引脚交叉连接 然后将两个USB TO TTL接口接在电脑上 二 传输文件 1 打开两个串口助手 波特率是115200 数据位8 停止位1 无校验
  • el-table合并列&同时在分页时不被割裂开

    核心思想 合并大表格 留出空间给到slot 插槽 在插槽内使用小表格 效果图 具体实现
  • 学生信息管理系统中遇到的一些问题

    学生信息管理系统虽然已经让师父验收了 但感觉还是有很多不足之处 主要是全心全意为客户服务的宗旨有好多地方没有注意到 除了光标的默认输入位置 修改密码时自动默认输入并选中旧密码 师父还提醒我把所有的有关信息的增 删 改 查的窗体都要设为主窗体
  • 访谈,智能座舱开发中的人机交互与人机工程布置

    Mixlab无界社区 跨学科 智能座舱 HCI 前沿知识 N1 智能座舱开发中的人机交互与人机工程布置 丰田部分车型的多媒体系统上的Apple CarPlay 今天是汽车HMI设计师 我最喜欢苹果的UI啦 IOS的UI风格 meta sha
  • Nacos 快速上手

    Nacos 快速上手 文章目录 Nacos 快速上手 准备工作 部署 Spring Boot 集成 配置说明 Spring Cloud Nacos Dubbo Nacos 公共 API 包 服务提供者 服务消费者 问题 微服务现在越来火 有
  • php奇偶数怎么求,php奇偶数循环

    根据表单提交的数据用户在浏览器生成图一示例的图形 图形参数说明 大小 图形中最长那一行的字符数 奇数行 偶数行 最长那一个行为奇数行 紧邻的两行算偶数行 以此类推 案例效果图 应用了for循环 还应用了一个php函数 str repeat
  • 初级算法-12-实现 strStr()

    描述 实现 strStr 函数 给你两个字符串 haystack 和 needle 请你在 haystack 字符串中找出 needle 字符串出现的第一个位置 下标从 0 开始 如果不存在 则返回 1 说明 当 needle 是空字符串时
  • Android Context 上下文 你必须知道的一切

    转载请标明出处 http blog csdn net lmj623565791 article details 40481055 本文出自 张鸿洋的博客 本文大多数内容翻译自 http www doubleencore com 2013 0