一、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. 详解c++指针的指针和指针的引用
  2. malloc函数和其他内存分配函数
  3. swift NSUserDefaults的基本使用
  4. 用VS2010编C#程序扫盲 2
  5. boa介绍文档
  6. mysql学习笔记4---mysql 复制---源代码
  7. hdoj 1892(二维树状数组)
  8. 练习使用css3实现3d按钮
  9. C++读写文件的简单例子
  10. iOS:删除小程序
  11. 乘法逆元...Orz
  12. PAT (Advanced Level) 1101. Quick Sort (25)
  13. angular $compile的使用
  14. 有源汇上下界可行流(POJ2396)
  15. Qt Creator快捷键设置
  16. Android工具
  17. Azure 认知服务 (1) 概述
  18. caffe编译问题-nvcc fatal:Unsupported gpu architecture 'compute_20'
  19. (转)一个MySQL 5.7 分区表性能下降的案例分析
  20. python numpy 学习

热门文章

  1. Cascode MOSFET increases boost regulator's input- and output-voltage ranges
  2. 无线遥控器方案 Si4010/Si4012
  3. 未能加载文件或程序集“file:///D:/Program Files (x86)/ArcGIS/DeveloperKit10.0/DotNet/ESRI.ArcGIS.3DAnalyst.dll”或它的某一个依赖项。试图加载格式不正确的程序。 行 129,位置 5。
  4. eclipse下使用git上传(下载)代码至(从)github
  5. 第十一章 PhpMyAdmin连接远程mysql服务器---连接openwrt 703N服务器
  6. Kubernetes集群安全概述
  7. MySQL解决[Err] 1206 - The total number of locks exceeds the lock table size问题
  8. python的with和__enter__ 、 __exit__
  9. linux ping IP地址与telnet 测试IP端口
  10. 鼠标辅助点击器(MouseClickAidHelper)