Android Context上下文误区

Android——获取全局Context的方法 ContextWrapper是一个包装类,它实现了Context接口,并且可以包装其他的Context对象。在Android中,每个Activity类都有一个getApplicationContext()方法,该方法返回的就是当前应用程序的全局Context对象。在Android中,每个View类都有一个getContext()方法,该方法返回的是该View所在的上下文Context对象。通过调用getApplicationContext()方法,我们可以获取全局的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上查看代码片派生到我的代码片
package com.mooc.shader.roundimageview;  
  
import android.content.Context;  
  
public class CustomManager  
{  
    private static CustomManager sInstance;  
    private Context mContext;  
  
    private CustomManager(Context context)  
    {  
        this.mContext = context;  
    }  
  
    public static synchronized CustomManager getInstance(Context context)  
    {  
        if (sInstance == null)  
        {  
            sInstance = new CustomManager(context);  
        }  
        return sInstance;  
    }  
      
    //some methods   
    private void someOtherMethodNeedContext()  
    {  
          
    }  
}  
 
对于上述的单例,大家应该都不陌生(请别计较getInstance的效率问题),内部保持了一个Context的引用;
 
这么写是没有问题的,问题在于,这个Context哪来的我们不能确定,很大的可能性,你在某个Activity里面为了方便,直接传了个this;这样问题就来了,我们的这个类中的sInstance是一个static且强引用的,在其内部引用了一个Activity作为Context,也就是说,我们的这个Activity只要我们的项目活着,就没有办法进行内存回收。而我们的Activity的生命周期肯定没这么长,所以造成了内存泄漏。
那么,我们如何才能避免这样的问题呢?
有人会说,我们可以软引用,嗯,软引用,假如被回收了,你不怕NullPointException么。
把上述代码做下修改:
 
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
public static synchronized CustomManager getInstance(Context context)  
    {  
        if (sInstance == null)  
        {  
            sInstance = new CustomManager(context.getApplicationContext());  
        }  
        return sInstance;  
    }  
 
这样,我们就解决了内存泄漏的问题,因为我们引用的是一个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吗?


独立站如何采集商品?外贸独立站采集教程 从这里Robert了解到还有国内有很多仿牌卖家、微商,都有类似的情况,他们出海的阻碍主要在于支付、物流、推广。8.插件“抓取任务”列表手动点同步,将商品同步到主商城后台商品管理列表(商品默认同步到下架列表中) 后台商品管理下架列表显示已同步商品。5.店铺信息修改完成后,可以开始采集商品,采集时弹窗中会自动识别当前平台及商品链接,分类和相册名称可以自定义 编辑修改。4. 打开采集目标站商品页面,点开谷歌浏览器扩展程序列表,找到Shopyy采集平台,打开配置页。打开弹窗中的“店铺管理”,添加店铺信息。 阅读详情

相关推荐

POWER(十一)charge pump原理

电荷泵是一种基于电容充放电原理的DC-DC转换电路,通过开关控制实现电压转换,包括升压、降压和负压输出。其核心是利用电荷守恒原理,通过电容存储和转移电荷来改变输出电压。典型拓扑结构包括倍压电路和多阶升压电路,具有结构简单、体积小等优势。关键参数包括转换效率、输出电流能力和开关频率,适用于芯片供电、显示屏驱动等低功耗场景。LVDS部分补充说明了自举电路在驱动电路中的应用及其自同步特性。

zhlwsh的博客 2827

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

转载请标明出处:http://blog.youkuaiyun.com/lmj623565791/article/details/40481055,本文出自:【张鸿洋的博客】 本文大多数内容翻译自:http://www.doubleencore.com/2013/06/context/我重新组织了下内容以及结构,建议大家尽可能看下原文。 1、Context概念 其实一直想写一篇关于Context的文章,但是又...

modabobo 5323

【华为2021校招】笔试题【通用硬件】

时间:2020/07/15 19:00 时长:60min 题型:40单选+5多选 难度:中等 考察范围:模电、数电、SI、EMC、电源、微机原理、计算机网络、材料

Jkcia的博客 4万+

我常用的BaseHandler

在Android开发过程中,我们不免会使用Handler类用来处理多线程发来的消息。 一般使用过程中,我们在Activity中定义MyHandler extends Hanlder,并重写了handleMessage方法,在多线程的地方通过sendMessage的方式发送消息,在handlerMessage里使用switch(msg.what) { case 1:break; case2:b

dodouaj的专栏 4237

Claude Desktop Cowork国内实操指南:本地文件自动化办公

大语言模型正从‘问答式AI’迈向‘执行型协作者’,其核心能力在于直接操作本地文件、调用系统工具并嵌入真实工作流。Claude Desktop的Cowork模式正是这一范式的代表,它通过轻量沙箱VM实现对Excel、PPT、PDF、音视频等办公资产的读写与处理,无需手动编码即可完成数据清洗、会议纪要生成、自动化报告输出等任务。技术价值体现在权限可控、环境隔离、结果可交付;典型场景覆盖行政文秘的文档流转、销售运营的数据分析、开发者的脚本调试与环境验证。本文聚焦国内用户高频卡点——网络链路、系统权限与工作流断层,

weixin_30617737的博客 468

Vivado IP核综合失败别慌:除了打补丁,这个TCL命令也能救急(以Video Frame Buffer为例)

本文详细解析了Vivado IP核综合失败的排查方法,特别是针对Video Frame Buffer Read IP的常见问题。从补丁安装到深入分析DCP文件生成机制,再到使用强大的TCL命令`foreach ip_in_proj [get_ips] {compile_c [get_ips $ip_in_proj]}`强制重编译,提供了一套完整的解决方案。帮助开发者快速定位并解决IP核综合失败问题,确保项目顺利进行。

weixin_30892889的博客 424

ContextWrapper,ContextImpl,Context的关系及dialog传入application的context为什么会报错

问题 在Android中都知道context,activity,application,service都间接的继承于context。在他们内部都有一个context,那他们之间有什么区别吗,dialog创建时可以传入application的context吗?一开始看到这个问题的时候一脸懵逼,还是通过查看源码寻找一下答案吧。 各种context源码 Context源码 public abstract class Context { */ public abstract AssetMan

jhxlx的博客 1049

基于python的排课表系统,用python编写排课系统

实现一个具体的课程管理系统。(5) 学生可以查看自己选上的课的成绩,以及各个课程的得分、绩点,并给出其平均绩点,但不允许查看年级其他人的成绩。(2) 学生定制专属课表,可以查看整个学期本人的课程安排,包括课程名称、上课时间、上课地点、任课老师、学分等等。(13) 系主任可以查看整个系的全部学生以及他们的平均绩点,可以对每个班进行排名,或者也可以对整个系进行排名。(15) 系主任可以查看整个学期所开设的所有课程,包括这些课程的全部详细信息。(1) 学生基本信息的查询,学生可以对本人的系统登陆密码进行修改。

yang0728y的博客 2000

springboot拦截器,拦截完后,传送继续传递

springboot在添加拦截器的时候,拦截完参数后,发现进入方法里面参数为空,后经百度后,发现有很多人遇到了和我一样的问题,现做写个博客,记录和分享解决方法。 1.springboot添加拦截器继承HandlerInterceptorAdapter类,重写preHandle方法,这里我主要是获取requestBody里面和request里面的userId,但是在get和post请求进入方法的时...

选择大于努力吗? 1万+

Matlab Arduino 硬件支持包安装 MATLAB_Support_Package_for_Arduino_Hardware

Matlab Arduino硬件支持包离线安装

weixin_43283734的博客 2842

抖音中动态生成msToken的方法

抖音中动态生成msToken的方法

sh_moranliunian的博客 2486

<Android编程权威指南>之1.6 Activity.this和this的区别

public class QuizActivity{ ... mFalseButton.setOnClickListaner(new View.OnClickListener(){ @Override public void onClick(View v){ Toast.makText(QuizActivity.this,

along 1131

【WRF理论第十四期】 VEGPARM.TBL 文件详解

WRF 读取 VEGPARM.TBL 文件

WW、forever的博客 576

Android深入理解Context–Context使用的误区

我们分为四篇文章详细介绍Context, 这是第四篇 Android深入理解Context–Application中Context的创建过程 Android深入理解Context–Activity中Context的创建过程 Android深入理解Context–Service中Context的创建过程 Context使用的误区 下面说本系列第一篇文章的第二个题目:getAppl...

周将的博客 1147

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android深入理解Context--Application中Context的创建过程

我们分为四篇文章详细介绍Context, 这是第一篇 1 Android深入理解Context–Application中Context的创建过程 2 3 4 前言 Context是我们在开发中经常使用到的一个类,它的功能非常丰富,但是很多人可能仅仅知道怎么用, 或者说是比较迷茫的使用, 不知道Context内部的逻辑,这一次我们就从源码的角度来分析一下Context。 在讲解之前,首先抛出...

周将的博客 3063

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android Context完全解析,你所不知道的Context的各种细节

Context相信所有的Android开发人员基本上每天都在接触,因为它太常见了。但是这并不代表Context没有什么东西好讲的,实际上Context有太多小的细节并不被大家所关注,那么今天我们就来学习一下那些你所不知道的细节。我们知道,Android应用都是使用Java语言来编写的,那么大家可以思考一下,一个Android程序和一个Java程序,他们最大的区别在哪里?划分界限又是什么呢?其实简单点分析,Android程序不像Java程序一样,随便创建一个类,写个main()方法就能跑了,而是要有一个完整的

郭霖的专栏 17万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android Context 是什么?

【转载请注明出处:http://blog.youkuaiyun.com/feiduclear_up 优快云 废墟的树】引言Context对于Android开发人员来说并不陌生,项目中我们会经常使用Context来获取APP资源,创建UI,获取系统Service服务,启动Activity,绑定Service,发送广播,获取APP信息等等。那么Context到底是什么?Context又是怎么来实现以上功能的?在什

废墟的树的专栏 3万+

Android Context完全解析与各种获取Context方法

Context类型 我们知道,Android应用都是使用Java语言来编写的,那么大家可以思考一下,一个Android程序和一个Java程序,他们最大的区别在哪里?划分界限又是什么呢?其实简单点分析,Android程序不像Java程序一样,随便创建一个类,写个main()方法就能跑了,而是要有一个完整的Android工程环境,在这个环境下,我们有像Activity、Service、BroadcastReceiver等系统组件,而这些组件并不是像一个普通的Java对象new一下就能创建实例的了,而是要有它们

ayang1986的专栏 1106

Android深入理解Context--Activity中Context的创建过程

我们分为四篇文章详细介绍Context, 这是第二篇 Android深入理解Context–Application中Context的创建过程 Android深入理解Context–Activity中Context的创建过程 Android深入理解Context–Service中Context的创建过程 Context使用的误区 上一节讲了源码Application中创建Cont...

周将的博客 1738

Android开发 Context详解与类型 转载

Android开发 Context详解与类型 转载 转载地址:https://blog.youkuaiyun.com/guolin_blog/article/details/47028975 个人总结: Context分为   activity : activity其...

weixin_30781631的博客 101

Context的‘身份危机’:为何你的Toast不显示?解密Android上下文选择策略

本文深入解析Android开发中Context的‘身份危机’,探讨为何Toast不显示等常见问题。通过对比Activity Context与Application Context的区别,提供Context选择策略和最佳实践,帮助开发者避免常见误区,正确使用getApplicationContext()、this等获取方式,提升应用稳定性和性能。

defi6farmer的博客 196

Context 介绍

安卓真难学,搜达一堆博文,看得似懂非懂。 以下转自 http://www.cnblogs.com/jingmengxintang/p/7889311.html 和 https://www.cnblogs.com/tsingke/p/9127758.html 1、Context 概念 Context是个抽象类,通过类的结构可以看到:Activity、Service、Application都是Cont...

qq_37870841的博客 978
上一篇: android 判断切换后台 判断按下home键
下一篇: Android性能优化全方面解析
绝凌峰
博客等级 码龄18年 28粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值