Android Context 详解

如何在Adapter中正确的使用Context 前言 最近我在项目中,发现一个同事写 RecyclerView.Adapter 的时候都习惯定义一个全局的私有 mContext,然后在 onCreateViewHolder(parent: ViewGroup, viewType: Int) 方法中进行赋值操作 mContext = parent.context。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wzo0BlR5-1611468169753)(#pic_center)] 第一次见到这样的写法, 三种方式 阅读详情

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.getApplication方法获取。


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

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

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

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



参考推荐:

Android程序里面传Context对象

Android context(Application/Activity)与内存泄露


来源:http://blog.youkuaiyun.com/sunboy_2050/article/details/8027907#


android studio for android learning (二十 )android中this、context等关键概念理解全解 1. 最近看的代码中经常看见this,在java中的this第一反应就是当前对象,可以用来引用变量或是方法,一看就很懵B,所以这里通过例子来详细讲下this的用法。2.例如下面代码button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast 阅读详情

相关推荐

Android全面解析之Context机制

前言 很高兴遇见你~ 欢迎阅读我的文章。 在文章Android全面解析之由浅及深Handler消息机制中讨论到,Handler可以: 避免我们自己去手动写 死循环和输入阻塞 来不断获取用户的输入以及避免线程直接结束,而是采用事务驱动型设计,使用Handler消息机制,让AMS可以控制整个程序的运行逻辑。 这是关于android程序在设计上更加重要的一部分,不太了解的读者可以前往阅读了解一下。而当我们知道android程序的程序是通过main方法跑起来的,然后通过handler机制来控制程序的运行,那么四

一只修仙的猿 8610

Android Context详解(全解析)

我们最常用的Activity,Service,Application都是Context的子类。所以知道Context的具体实现是非常有必要的。 下面是Context的体系结构图: Context本身是一个抽象类。他的实现类是ContextImpl。而ContextWrapper是一个包装类(装饰设计模式)。在我们用IDE查看Context继承关系的时候,我们是不能直接看到ContextImpl这个类的,通过这种手段让程序员不能直接看到ContextImpl这个类,而只能看到ContextWrapper这个

ScottePerk的博客 1万+

LiblibAI新手教程:从零开始训练你的第一个LoRA模型(保姆级指南)

本文提供LiblibAI平台上从零开始训练LoRA模型的保姆级教程,涵盖数据准备、参数优化到效果调优全流程。详细解析LoRA技术优势,包括云端计算资源、自动化预处理工具等,帮助新手快速掌握自定义模型训练技巧,实现高效AI绘画创作。

dell8的博客 619

Android CHRE (Context Hub Runtime Environment)简介

虽然 CHRE 框架可以是多线程的,但给定的 nanoapp 永远不会从多个线程并行执行。CHRE 框架通过三个 nanoapp 入口点之一( nanoappStart() 、 nanoappHandleEvent()和nanoappEnd() )或通过在先前的 CHRE API 调用中提供的回调与给定的 nanoapp 交互,并且 nanoapps 与 CHRE 框架交互并通过 CHRE API 的底层系统。在针对小核的应用开发上,提供给应用开发的支持有限,会依赖硬件接口,导致代码通用性、跨平台有问题。

yinminsumeng的博客 1324

从零到一:YT8512C PHY芯片在STM32F407上的LWIP移植实战与避坑指南

本文详细介绍了YT8512C PHY芯片在STM32F407平台上基于LWIP协议栈的移植实战,涵盖硬件连接、CubeMX配置、寄存器定制和调试技巧。重点解析了与主流PHY芯片的差异,提供了完整的避坑指南和优化建议,帮助开发者快速实现稳定可靠的嵌入式网络连接。

uber9的博客 538

昇腾NPU实战:PaddleSpeech语音模型高效部署与性能优化指南

本文详细介绍了如何在华为昇腾NPU上高效部署PaddleSpeech语音识别模型。通过使用官方Docker镜像、解决依赖冲突、修改源码适配NPU算子,并应用混合精度与批处理等优化技巧,实现模型在昇腾平台上的稳定运行与性能提升,为AI语音应用提供高性价比的国产硬件部署方案。

weixin_29214691的博客 181

android context 实例,安卓Android Context类实例详解

1.例如下面的代码片段,Toast类的第一个参数接受一个Context对象:@Overrideprotected Dialog onCreateDialog(int id) {switch (id) {case 0:Builder builder = new AlertDialog.Builder(this);builder.setIcon(R.drawable.ic_launcher);buil...

weixin_32126843的博客 356

Keil5安装多版本共存方案:实用技巧分享

分享Keil5安装过程中实现多版本共存的实用方法,解决开发环境冲突问题。通过合理配置路径与版本管理,让keil5安装更高效稳定,提升嵌入式开发体验。

weixin_42514750的博客 1525

安卓应用有几个context

最近看源码看到Context这一块,发现很多网上的博客对“安卓应用有几个context”这一个问题统一给出的答案是: Activity数量+Service数量+1 我通过源码的分析发现根本不是这样,Context的数量应该是: 2*(Activity数量+Service数量+1) 要搞清楚这个问题就需要研究Activity和Application的生成了,Activity和Application的生成都位于ActivityThread的performLaunchActivity方法源代码: Contex

whoami_I的博客 632

人大金仓的‘影子表’sys_user:搞懂Schema优先级,告别字段不存在的报错

本文深入解析人大金仓数据库中‘影子表’sys_user的Schema优先级问题,帮助开发者解决字段不存在的报错。通过分析Schema搜索路径机制,提供四种解决方案,包括连接时指定Schema、动态调整搜索路径、永久修改用户设置和使用完全限定表名,确保查询准确无误。

weixin_30329623的博客 596

【ComfyUI报错解决】K采样器 mat1和mat2形状不匹配错误分析与修复 mat1 and mat2 shapes cannot be multiplied (77x2048 and 4096x

如果你在 ComfyUI 里遇到K采样器报错:mat1 和 mat2 shapes cannot be multiplied确认大模型和 LoRA 是否是同一版本(SDXL vs SD1.5,不能混用)。如果用了双 CLIP 加载器,要确认加载的类型和选择的模型类型是否匹配。加载→ 类型选flux加载 SDXL 专用的 clip/t5 → 类型选sdxl避免不同版本模型和 LoRA 混搭,保持一致性。模型+LoRA+CLIP 类型必须保持同一版本,不然就会报错。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2408

安卓-Android什么是context?

原帖: link Android面试:来说一说Context吧,Android中的Context是什么?能干什么?怎么用呢?字节走动_Android关注42020.08.12 22:26:52字数 3,633阅读 813 Activity mActivity =new Activity() 作为Android开发者,不知道你有没有思考过这个问题,Activity可以new吗?Android的应用程序开发采用JAVA语言,Activity本质上也是一个对象,那上面的写法有什么问题呢?估计很多人说不

ruiruiddd的博客 279

【SAP HANA 24】HANA与Oracle SQL语法对照表

HANA SQL参考及Oracle 语法对照

探索 Java 编程的技巧、最佳实践和解决方案。本博客提供针对 Java 开发者的实用指南,涵盖从基础到高级话题,旨在提升编程效率和技能。 1421

安卓c语言获取context,Android中Context详解 ---- 你所不知道的Context

二、 什么时候创建Context实例熟悉了Context的继承关系后,我们接下来分析应用程序在什么情况需要创建Context对象的?应用程序创建Context实例的情况有如下几种情况:1、创建Application 对象时, 而且整个App共一个Application对象2、创建Service对象时3、创建Activity对象时因此应用程序App共有的Context数目公式为:总Context实例...

weixin_26854475的博客 201

【S32K3 MCAL配置】-1.1-GPIO配置及其应用-DIO之高低电平输出-点亮LED灯(基于MCAL)

【S32K3 MCAL配置】-1.1-GPIO配置及其应用-点亮LED灯(基于MCAL)

「汽车电子助手」的博客 1937

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

安卓c语言获取context,认识一下Android里的Context

认识一下Android里的Context侯亮(本文以Android 7.0为准)1 什么是Context?在Android平台上,Context是一个基本的概念,它在逻辑上表示一个运行期的“上下文”。其实何止是Android平台,在其他平台上,一样有上下文的概念,比如一个进程,其实也是个上下文。我们在编写最简单的C语言程序时,凭什么写一句简单的malloc()就可以申请到内存,写一句简单的open...

weixin_42396760的博客 412

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

安卓c语言获取context,Android全局获取Context实例详解

Android全局获取Context实例详解在弹出Toast 启动活动 发送广播 操作数据库 使用通知等等时都需要Context如果操作在活动中进行是很简单的,因为活动本身就是一个Context对象但是当逻辑代码脱离了Activity类,此时使用Context就需要一些技巧了:我们可以定制一个自己的Application类,以便管理程序内一些全局状态信息,比如全局Context代码如下:publi...

weixin_33781072的博客 284

SAP B1中文培訓教材_SDK

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android的cantext对象,安卓Android Context类实例详解

1.例如下面的代码片段,Toast类的第一个参数接受一个Context对象:@Overrideprotected Dialog onCreateDialog(int id) {switch (id) {case 0:Builder builder = new AlertDialog.Builder(this);builder.setIcon(R.drawable.ic_launcher);buil...

weixin_34802266的博客 223

安卓中的context详解

大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中    时刻的在与它打交道,例如:Service、BroadcastReceiver、Activity等都会利用到Context的相关方法 ; 说它陌生,完全是    因为我们真正的不懂Context的原理、类结构关系。一个简单的问题是,一个应用程序App中存在多少个Cont

smile0528的博客 459

Android安卓 如何在Service获取参数Context 以及AlertDialog.Builder(Context)的Context

我的程序主程序名称: B000Activity 在Service中调用参数Context 参数添加:B000Activity.b000.getApplicationContext() 我的需求是需要在NetWorkutils中调用参数Context 结束

暴走的山交君的博客 1434

深度详解 Android 之 Context

在 Android 开发中、亦或是面试中都离不开四大组件的身影,而在创建或启动这些组件时,并不能直接通过 new 关键字后跟类名来创建实例对象,而是需要有它们各自的上下文环境,也就是本篇文章要讨论的 Context。Context 提供了关于应用环境全局信息的接口。它是一个抽象类,它的执行被 Android 系统所提供。它允许获取以应用为特征的资源和类型,是一个统领一些资源(应用程序环境变量等)的上下文。............

neuHenry 9178

Android之Context详解

1.Context是什么?     它描述的是一个应用程序环境的信息,即上下文,是维持各大组件能正常工作的一个核心功能类,该类是一个抽象类,提供了一些最基本的应用级别的操作 2. Context相关类的继承关系? 3.相关类介绍:  3.1 Context.java         路径: /frameworks/base/core/java/android/content/Con...

门心叼龙的专栏 3985

Android中Context详解

给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中时刻的在与它打交道,例如:Service、BroadcastReceiver、Activity等都会利用到Context的相关方法 ; 说它陌生,完全是因为我们真正的不懂Context的原理、类结构关系。 Context,中文直译为“上下文”,SDK中对其说明如下:Interf

学习 2347
上一篇: android ListView监听滚动条滚动到底部时继续加载
下一篇: 两种实现Toast 的例子(图片&文字)
SpeedyCoder
博客等级 码龄14年 415粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值