专栏首页上善若水022android初级篇之android的Context

022android初级篇之android的Context

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. 它提供了application 环境全局信息接口;
  2. 该类是一个抽象类(abstract class),Android提供了该抽象类的具体实现类;
  3. 通过该类我们可以访问应用程序的资源和类,也包括进行应用级别的操作,例如启动一个Activity,发生Broadcast,接收Intent信息等。

相关的类

022_01.png

Context类

路径: /frameworks/base/core/java/android/content/Context.java 说明: 抽象类,提供了一组通用的API。

public static final int MODE_PRIVATE = 0x0000;
public static final int MODE_APPEND = 0x8000;

public static final int MODE_MULTI_PROCESS = 0x0004;

 /** Return an AssetManager instance for your application's package. */
public abstract AssetManager getAssets();

/** Return a Resources instance for your application's package. */
public abstract Resources getResources();

/** Return PackageManager instance to find global package information. */
public abstract PackageManager getPackageManager();

/** Return a ContentResolver instance for your application's package. */
public abstract ContentResolver getContentResolver();
public abstract Looper getMainLooper();
 public abstract Context getApplicationContext();

ContextIml.java类

路径 :/frameworks/base/core/java/android/app/ContextImpl.java

说明:该Context类的实现类为ContextIml,该类实现了Context类的功能。该函数的大部分功能都是直接调用其属性mPackageInfo去完成。

ContextWrapper类

路径 :\frameworks\base\core\java\android\content\ContextWrapper.java

说明: 正如其名称一样,该类只是对Context类的一种包装,该类的构造函数包含了一个真正的Context引用,即ContextIml对象。

ContextThemeWrapper类

路径:/frameworks/base/core/java/android/view/ContextThemeWrapper.java

说明:该类内部包含了主题(Theme)相关的接口,即android:theme属性指定的。只有Activity需要主题,Service不需要主题,所以Service直接继承于ContextWrapper类。

Activity类 、Service类 、Application类都是Context的子类

创建Context实例

因此应用程序App共有的Context数目公式为:

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

1、创建Application对象的时机

每个应用程序在第一次启动时,都会首先创建Application对象。如果对应用程序启动一个Activity(startActivity)流程比较 清楚的话,创建Application的时机在创建handleBindApplication()方法中,该函数位于 ActivityThread.java类中

2、创建Activity对象的时机

通过startActivity()或startActivityForResult()请求启动一个Activity时,如果系统检测需要新建一个Activity对象时,就会 回调handleLaunchActivity()方法,该方法继而调用performLaunchActivity()方法,去创建一个Activity实例,并且回调 onCreate(),onStart()方法等, 函数都位于 ActivityThread.java类

3、创建Service对象的时机

通过startService或者bindService时,如果系统检测到需要新创建一个Service实例,就会回调handleCreateService()方法, 完成相关数据操作。handleCreateService()函数位于 ActivityThread.java类

参考链接

  1. Android中Context详解 ---- 你所不知道的Context
  2. Android源码分析-全面理解Context

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 037android初级篇之Activity的几个重要函数

    手机屏幕事件的处理方法onTouchEvent。该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件...

    上善若水.夏
  • 010android初级篇之Activity的返回值

    使用startActivity方式启动的Activity和它的父Activity无关,当它关闭时也不会提供任何反馈。 但是使用startActivityFor...

    上善若水.夏
  • L001 Linux和android ndk 外部程序调用popen 和system的用法

    popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。这个进程必须由 pclose() 函数关闭...

    上善若水.夏
  • 关于拷贝对象引用到local变量的一些思考

    在JDK的Java类源码里面,很多工具包的代码都有在使用某个成员变量之前,先拷贝该变量的对象引用到方法的局部变量之中,如下:

    我是攻城师
  • C#笔记:重构-模版模式

    在重构中,我们需要对代码不同但是结构相同的函数进行合并。我们可以把函数中不同的步骤都封装成一个个不同的函数,然后作为抽象函数上移到父类,父类用统一的函数进行调用...

    超级大猪
  • 面向对象三大特性-----封装、继承、多态

      前面有文章写到了面向对象编程和面向对象设计的头五大原则(SOLID五大原则)。今天我们再来谈谈面向对象的三大特性--封装、继承、多态

    小世界的野孩子
  • springboot自定义配置文件转换器

    前两篇文章我们写了自定义配置文件,使用@value 加载。这一次我们来看看@ConfigurationProperties 的其他用法

    分享干货的你
  • Android项目开发全程(三)-- 项目的前期搭建、网络请求封装是怎样实现的

      在前两篇博文中已经做了铺垫,下面咱们就可以用前面介绍过的内容开始做一个小项目了(项目中会用到Afinal框架,不会用Afinal的童鞋可以先看一下上一篇博文...

    codingblock
  • 系统架构师设计培训心得之二——架构设计

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    剑影啸清寒
  • Sweet Snippet 之 Timeslice Update

    游戏开发中,我们一般都要进行大量的对象更新(Update)操作,拿 Unity 中的 MonoBehavior 举例,其便支持定义专门的 Update 方法来处...

    用户2615200

扫码关注云+社区

领取腾讯云代金券