Context面试-Android

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Context面试-Android相关的知识,希望对你有一定的参考价值。

Context 也就是上下文对象,是 android 常用的类。我们常用的 Activity,Service 和 Application 都间接的继承了 Context。Context 是一个抽象类
日常开发中,使用 Context 的地方数不胜数,比如像弹 Toast、创建 Dialog、创建自定义 View 等等时候都需要传入 Context 对象,还有像启动 Activity、Service、访问资源和获取系统服务等等,都离不开 Context。它允许访问特定于应用程序的资源和类,以及对应用程序级操作的调用,比如启动活动,发送广播和接收意图等;

Activity, Service, Application 都是 Context 的子类(Activity、Service 和 Application 都间接的继承了 Context)。

Context 的具体实现类ContextImpl, 还有一个包装类 ContextWrapper, ContextWrapper 的子类有 Service,Application,ContextThemeWrapper, Activity 又是 ContextThemeWrapper 的子类,ContextThemeWrapper 也可以叫 UI Context,跟UI 操作相关的最好使用此类 Context。

ContextWrapper 中有个 mBase,这个 mBase 其实是 ContextImpl,它是在Activity, Service, Application 创建时通过 attachBaseContext() 方法将各自对对应 ContextImpl 赋值的。对 context 的操作,最终实现都是在 ContextImpl。

对于 startActivity操作

  • 当为Activity Context则可直接使用;
  • 当为其他Context, 则必须带上FLAG_ACTIVITY_NEW_TASK flags才能使用;因为非 Activity context 启动 Activity 没有 Activity 栈,则无法启动,因此需要加开启新的栈;
  • 另外UI相关要Activity中使用.

getApplication()和getApplicationContext() 区别?

  1. 对于Activity/Service来说, getApplication()和getApplicationContext()的返回值完全相同; 除非厂商修改过接口;
  2. BroadcastReceiver在onReceive的过程, 能使用getBaseContext().getApplicationContext获取所在Application, 而无法使用getApplication;
  3. ContentProvider能使用getContext().getApplicationContext()获取所在Application. 绝大多数情况下没有问题, 但是有可能会出现空指针的问题

获取Context

四种方法

  1. View.getContext,返回当前View对象的Context对象,通常是当前正在展示的Activity对象。
  2. Activity.getApplicationContext,获取当前Activity所在的(应用)进程的Context对象,通常我们使用Context对象时,要优先考虑这个全局的进程Context。
  3. ContextWrapper.getBaseContext():用来获取一个ContextWrapper进行装饰之前的Context,可以使用这个方法,这个方法在实际开发中使用并不多,也不建议使用。
  4. Activity.this 返回当前的Activity实例,如果是UI控件需要使用Activity作为Context对象,但是默认的Toast实际上使用ApplicationContext也可以。

getApplication()和getApplicationContext()
getApplication()方法的语义性非常强,一看就知道是用来获取Application实例的,但是这个方法只有在Activity和Service中才能调用的到。那么也许在绝大多数情况下我们都是在Activity或者Service中使用Application的,但是如果在一些其它的场景,比如BroadcastReceiver中也想获得Application的实例,这时就可以借助getApplicationContext()方法了。

面试高频题:

  1. 应用中一共有几个 Context 对象
  2. Context、ContextImpl、ContextWrapper、ContextThemeWrapper 这几个类有什么关系?
  3. 说说 Application Context 的创建过程

1、应用中一共有几个 Context 对象

Context数量=Activity数量+Service数量+1,1 是 Application 的数量。Activity、Service 和 Application 都间接的继承了 Context。

2、Context、ContextImpl、ContextWrapper、ContextThemeWrapper 这几个类有什么关系?

Context
Activity -> ContextThemeWrapper -> ContextWrapper -> Context
Service -> ContextWrapper -> Context
Application -> ContextWrapper -> Context
由继承图得到。

以上是关于Context面试-Android的主要内容,如果未能解决你的问题,请参考以下文章

Context面试-Android

Flutter开发之——文件系统目录pathprovider,997页手淘Android面试真题解析火爆全网

Android中,Context,啥是Context

Android基础之自定义Application

Android中,Context,啥是Context

android context是啥