Android中Context详解

建议先去了解一下安卓设计模式中的装饰模式。


Context对大家来说并不陌生,它在Android应用层开发中占据了绝对重要的地位,不管是Framework提供给我们的四大组件还是应用级别的Application,还是负责表现层的View相关类,甚至连我们很多时候创建的实体类都会需要持有一个Context的引用,在Framework中,Context贯穿了整个Android的MVC框架,它的应用很普遍。

Context,SDK中对其说明如下:

    Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.

从上述翻译得知:

  1. 它描述的是一个应用程序环境的信息,即上下文
  2. 该类是一个抽象类,Android提供了该抽象类的具体实现类(ContextIml类)
  3. 通过它,我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动Activity、发送广播、接受Intent信息等

  • Context相关类的继承关系即相关类介绍

这里写图片描述

  • Context类
    抽象类,提供了大量相当牛的方法,这些方法不但与四大组件密切相关,还与资源文件、文件管理、包管理、类加载、权限管理、系统级服务获取等各式各样的功能相切合。源代码(部分)如下:
public abstract class Context {

    public abstract void startActivity(Intent intent);
    public abstract void startActivity(Intent intent, @Nullable Bundle options);
    public abstract void startActivities(Intent[] intents);
    public abstract void startActivities(Intent[] intents, Bundle options);
    public abstract void sendBroadcast(Intent intent);
    public abstract void sendBroadcast(Intent intent,
            @Nullable String receiverPermission);
    public abstract Intent registerReceiver(@Nullable BroadcastReceiver receiver,
                                            IntentFilter filter);
    public abstract void unregisterReceiver(BroadcastReceiver receiver);
    //...

}

以上的这些方法都是常用的,当然这里仅仅是一个声明。

  • ContextImpl类
    就如装饰模式,Context中方法的所有实现均由ContextImpl类承担。ContextImpl类就是Context的具体实现类。

  • ContextWapper类
    ContextWapper中的Context引用指向的是一个ContextImpl的实例。ContextWapper中的所有方法都仅仅是调用了ContextImpl中的对应方法。装饰模式应用套路就是这样,对于具体方法的包装扩展则有ContextWapper的具体子类来完成,比如Activity、Service、Appliaction。

  • 图中可以看出,Service和Appliaction的类继承关系比较像,而Activity还多了一层ContextThemeWrapper,这是因为Activity有主题的概念,而Service是没有界面服务的,Appliaction更是一个抽象的东西,它也是通过Activity类呈现的。


  • Context的数量

    应用中Context的总实例子个数 = Service个数 + Activity个数 + 1( Application对应的Context实例)。

那么四大组件的其它两个没有保持Context对象了嘛?
BroadcastReciver并非直接或间接继承Context,但每次接受广播的时候,onReciver()方法都会收到一个Context对象,该Context对象是ReciverRestrictedContext的一个实例;而在ContentProvider中你可以调用其getContext方法获取一个Context对象。这些Context都是直接或者间接来自于Activity、Service和Appliaction。


  • Context的应用场景
    在平时应用开发中,经常会使用到Context对象,那么如上分析中,Context在对应开发里的来源无非就是Activity、Service和Appliaction这三个,那么我们该如何选择使用哪一个Context对象呢?一个比较简单的辨别是,当你无法确定使用某个Context对象是否会造成长引用导致内存泄漏时就是用Appliaction的Context对象,因为Appliaction存在于整个应用的生命周期内。
    接下来简单列出Context的应用场景:
应用场景使用Appliaction的Context对象使用Activity的Context对象使用Service的Context对象
Show a Dialog
Start an Activity
Layout Inflation
Start a Service
Bind a Service
Register BroadcastReceiver
Load Resource Values

从表中可以看到,和UI相关的都使用Activity的Context对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值