Android Context原理与使用的总结



一、Context继承体系 与 Context是如何创建的

1. Context继承体系

只用记住一句:Activity 、 Service 与Application 都是继承自ContextWrapper,而ContextWrapper implements Context。每个:Activity 、 Service 与Application都是一个Context实例。


2. Context 何时创建、怎样创建的 - 查看源码


以上3篇文章都是从源码角度分析Context何时创建的,但是对于平时的开发来说,仅需要知道Activity 与Service 都是继承自Context,只要创建新的Activity 或者 Service 实例,都是创建新的Context实例。

Context 总数 = Activity个数 + Service 个数 + 1个ApplicationContext

可以通过命令行 查看Context的个数
adb shell dumpsys meminfo package_name


二、关于Context的疑问

1. getBaseContext 与 getApplicationContext 区别?
持有Activity的Context 相当于持有Context,而持有AppliactionContex全局仅有这一个

2. 视图中的Context从哪来的?
例如:new TextView(Context);
通常在一个Activity中传入的就是当前Activity或者Activity.getBaseContext(),所以通过View.getContext()其实就是当前Activity的引用。

常见场景,Adapter通常通过构造器传递Context,用于getView 时inflate 视图。但是getView最有一个参数是parentView 这个是ListView对象本身,可以通过parentView.getContext获取Context对象减少手动传递。

3. Context 会出错的地方
Dialog.Builder必须传入Activity,而不能传入Activity.getApplicationContext()

4. Context作用,查看方法
访问资源、创建视图、创建四大组件

Context是什么?

参考资料: 

三 内存溢出,因为引用Context导致

1. Context导致内存溢出的原因:
以上文章讲解的很详细可以查看文章,以下是简单描述:
最常见的内存形式是Bitmap未得到释放,而图片通常ImageView持有导致ImageView也不会被GC释放,创建ImageView肯定需要Context,这个Context是Activity。
Bitmap -> ImageView -> Contex(Activity)
如果Activity总是不能得到释放,导致内存不足最终OOM


2. 对于生命周期很长的对象,使用ApplicationContext,以下文档介绍自定义Application可以在项目全局都很方便获取Application Context的方法

使用自定义Application,需要Context对象时传入,避免因持有Context导致的内存溢出。因为ApplicationContext全局仅有一个实例,而多个Activity本身继承自Context,就是多个Context实例。
Android中Activity共享变量的另一方法:Application context

4. Context内存溢出相关资料
Android学习系列(36)--App调试内存泄露之Context篇(上)
Android学习系列(37)--App调试内存泄露之Context篇(下)

四、自己创建Context

Android获取其他包的Context实例然后干坏事




  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android开发中,Context是一个重要的概念,它代表了Android应用程序的当前状态和环境。它提供了访问应用程序资源(如布局、字符串等)和执行各种操作(如启动Activity、访问数据库等)的能力。 数据库在Android开发中也是非常常见的,它用于存储和管理应用程序中的数据。Android提供了SQLite数据库来支持本地数据存储。要在应用程序中使用数据库,首先需要创建一个数据库实例,并获取对数据库的读写访问权限。这就是我们需要Context的原因之一。 通过Context,我们可以获取应用程序的上下文环境,包括访问数据库所需的一些关键组件,如ContentResolver和SQLiteOpenHelper。ContentResolver是用于访问应用程序的数据提供者的类,而SQLiteOpenHelper则是一个辅助类,用于管理SQLite数据库的创建和版本控制。 使用Context来访问数据库时,可以通过调用getApplicationContext()方法获取全局的应用程序上下文,或者通过调用Activity的getContext()方法获取当前活动的上下文。这样就可以使用上述提到的组件来执行与数据库相关的操作,例如插入、查询、更新和删除数据等。 总结一下,ContextAndroid中是一个重要的概念,它提供了访问应用程序资源和执行各种操作的能力。而数据库则是Android开发中常用的数据存储方式,通过Context可以获取对数据库的读写访问权限,并使用相关组件来操作数据库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值