Android中的Context到底是什么?

Android面试技术要点汇总
2021-05-17 14:29 · 阅读时长3分钟
小课

在Android开发中,我们经常会用到Context,那么Context到底是什么呢?理解Context是什么?怎么用?会让我们在开发中避免一些问题。

什么是Context?

首先Context是Android SDK中定义的一个抽象类,通过Context我们可以获取应用内的资源,比如res/aseets,通过Context我们可以启动Activity、Service和发送广播等等。

有哪些不同的Context?

Context是个抽象类,它有两个重要直接子类,一个是ContextImpl,它实现了Context中的绝大部分功能,另外一个是ContextWrapper,它内部持有另外一个Context实例,通过代理的方式实现了Context。

Android中的Context到底是什么?

从上面可以看出,Application和Service直接继承了ContextWrapper,而Activity是继承了ContextWrapper的一个子类ContextThemeWrapper,它在父类的基础上扩展了定义主题等方法,因为Activity作为主要的UI组件,它是可以定义主题的。在Android项目中,我们可以通过Activity、Service和Application等组件来拿到Context实例。

Context能做什么?

上面提到了Context可以获取资源、启动Activity、Service等等,那不同的Context是否都一样呢?下面看看上面的几种Context的不同之处。

Android中的Context到底是什么?

从上面可以看出,Application和Service作为Context使用时,有一些限制

  • 不能用来显示Dialog,Dialog是使用Context的getSystemService方法获取WindowManager来管理自身的Window,而这两种Context本身也不涉及到UI,它们没有合法可用的WindowManager,而Activity重写了getSystemService方法,当获取WindowManager时会返回自身的WindowManager。
  • 不建议用来启动Activity,因为这两种Context不存在任务栈的相关信息,没法正确的处理任务栈,如果非要启动只能通过设置FLAG_ACTIVITY_NEW_TASK,创建一个新的任务栈来启动。
  • 不建议用来加载布局,因为这两种Context没有主题相关的信息,如果用来加载布局,只能以默认主题来加载布局,这样可能导致样式错误。
AndroidContext