谈谈安卓中Context的理解[附思维导图]

思维导图是个好东西,可以把知识串在一张图上,更便于理解记忆。

概述

Context是一个抽象基类。在翻译为上下文,也可以理解为环境,提供一些程序的运行环境基础信息

子类关系

封装类ContextWrapper

  • ContextThemeWrapper(带主题的封装类)
    • Activity
    • Service
    • Application

实现类ContextImpl

内存泄露问题

  • 静态资源导致的内存泄漏
    解决方案:避免使用静态资源,或者使用弱引用来解决相应。
  • 单例模式导致内存泄漏
    解决方案:使用getApplicationContext(),这样使用单例与Activity就无关了,Activity释放时则不会出现内存泄露

获取Context

  • View.getContext()
    返回当前View对象的Context对象,通常是当前正在展示的Activity对象
  • Activity.getApplicationContext()
    获取当前Activity所在应用进程的Context对象,通常使用Context时,优先考虑全局进程Context
  • ContextWrapper.getBaseContext()
    获取一个ContextWrapper装饰之前的Context,在实际开发中使用并不多,不建议使用
  • Activity.this
    返回当前Activity实例,UI控件需要使用Activity作为Context对象

总结

  • Context共有三种类型,Application、Activity和Service
    整个App共一个Application对象
  • Context数量 = Activity数量 + Service数量 + 1(Application)
  • 三个类都属于Context,功能是由ContextImpl类去实现的
  • 大多数场景下,三种类型的Context可以通用
  • 特殊场景不可通用(只能使用Activity类型的Context,否则将会出错)
    • 启动Activity
      安全考虑,Android不允许Activity或Dialog凭空出现,Activity的启动必须要建立在另一个Activity的基础上,以形成返回栈
    • 弹出Dialog
      Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog)

思维导图

安卓Context的理解

发布了70 篇原创文章 · 获赞 176 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/zheng_weichao/article/details/98672406