为什么在Android中需要Context?

介绍

在Android开发中,Context是一个非常重要的概念,但是很多开发者可能并不清楚它的真正含义以及为什么需要使用它。本文将详细介绍Context的概念,并解释为什么在Android应用中需要使用它。

Context的来源

Context的概念来源于Android框架,具体来说就是"android.jar"这个主要的Android框架。它加载在Android运行时环境中,可以被所有应用程序访问。在Android SDK中,有一个简化版本的Context,需要导入其中的一些类来使用它。

Android框架是在Android系统上运行的主要应用程序,而我们的应用程序只是这个主要应用程序的一些事件处理程序。可以想象一下,这个主要应用程序具有一个菜单,可以下载和控制一些小型应用程序。然而,这个主要应用程序需要向正在运行的小型应用程序提供一些信息,例如资源路径以及其他功能,比如访问资源、创建新文件、在数据库或文件中存储简单的键值对等等(一种与超级应用程序进行交互的API)。它还可以为我们的小型应用程序提供哪些其他功能呢?那么Android是如何将这些信息和功能传递给我们的呢?通过一个名为Context的类。

Context中的功能

当我们的应用程序被安装时,它们的资源文件(例如string.xml、layout XML文件、可绘制资源等)会被复制到一个特定的路径中,这个路径与源代码分离,因此我们无法使用相对路径访问它们。另外,我们的大多数资源都是XML文件,而要解析XML文件并检索特定的值是很困难的(实际上,资源被编译成二进制文件,从这个二进制文件中读取数据更加困难)。因此,Android提供了一些函数来帮助我们访问这些资源,例如:

  • • getResources().getString()

  • • getResources().getDrawable()

  • • getResources().getColor()

主题(Theme)是Context中的另一个重要概念。等等。

Context还提供了一些有用的API,如简单的键值对注册表(SharedPreferences)、数据库(SQLite)、其他已安装包的信息、请求权限等等。

在Android开发中,启动新的Activity是一项重要且频繁的任务,需要在许多地方调用startActivity方法。因此,最好能够在Context中提供startActivity方法(这还有其他原因,在下文中会详细解释)。

每个组件都有一个Context

现在我们知道应用程序为什么需要Context了,但为什么Context不是全局的呢?因为并不存在一个单一的Context。确切地说,整个应用程序只有一个Context对象,但对于每个创建的Activity,也会为其创建一个Context并分配给该Activity。你可以将ApplicationContext保存在一个静态变量中,以便在所有类中都可以访问。

其他的Context对象又有什么作用呢?我们应该知道它们也是Context类的实例,因此并没有根本的区别。如前所述,每个Activity都可以拥有自己的主题,因此它需要另一个Context实例。这还不是全部,在与Context相关的后退栈等原因(可以在链接中阅读https://developer.android.com/guide/components/activities/tasks-and-back-stack。请注意,Activity所属的Context在Activity结束时被销毁。

总的来说,有一个单一的ApplicationContext,它可以在整个应用程序的生命周期内存在,同时每个Activity和Service都有自己的Context,当这些组件(Activity或Service)被创建时,就会创建一个相应的Context。

装饰者设计模式

Context类是一个抽象类,不能被实例化,因此还有另一个实现了Context的类,称为ContextImpl.Application。Activity和Service类都是从ContextWrapper派生的,这是使用装饰者模式的一个示例。这些类接受一个Context对象(即ContextImpl的对象),并扩展了Context类以将所有调用函数转发给接收到的对象。通过这种方式,Context对象与组件分离,因此可以安全地将Context的引用传递给函数和类,而不是传递Activity或Service的引用。

注:转自 Kotin社区  为什么在Android中需要Context?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/283128.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA设计与实战之时钟及时序简介1

文章目录 一、时钟定义二、基本时序三、总结一、时钟定义 我们目前设计的电路以同步时序电路为主,时钟做为电路工作的基准而显得非常重要。 简单的接口电路比如I2C、SPI等,复杂一点接口比如Ethernet的MII、GMII等接口,它们都有一个或多个时钟信号。 那么什么是时钟信号?它…

【JAVA-Day69】抛出异常的精髓:深度解析 throw、throws 关键字,优雅处理异常问题

抛出异常的精髓:深度解析 throw、throws 关键字,优雅处理异常问题 🚀 抛出异常的精髓:深度解析 throw、throws 关键字,优雅处理异常问题 🚀一、什么是抛出异常 😊二、如何抛出异常 &#x1f914…

桌面概率长按键盘无法连续输入问题

问题描述:概率性长按键盘无法连续输入文本 问题定位: 系统按键流程分析 图一 系统按键流程 按键是由X Server接收的,这一点只要明白了X Window的工作机制就不难理解了。X Server在接收到按键后,会转发到相应程序的窗口中。在窗…

将mjpg格式数转化成opencv Mat格式

该博客可以解决如下两个问题: 1、将mjpg格式数据转化成opencv Mat格式 2、v4l2_buffer 格式获取的mjpg格式数据转换成Mat格式。 要将 MJPEG 格式的数据转换为 OpenCV 的 Mat 格式,您可以使用 imdecode 函数。imdecode 函数可以将图像数据解码为 Mat 对象…

C语言预处理详解及其指令

预处理详解 1.预定义符号2.#define定义常量基本使用方法举例子如果在define定义的表示符后面加上分号会发生什么?用一下来解释 3. #define定义宏举例例1例2 4. 带有副作用的宏参数例如: 5. 宏替换的规则6. 宏函数的对比宏和函数的一个对比 7. #和##7.1 #运算符7.2 #…

chrome升级后,调试vue在控制台输出总是显示cjs.js

当前chrome版本120.0.6099.72 在vue中使用console.log输出时,总是显示cjs.js多少多少行,不能显示源文件名及行数 【解决方案】 打开控制台的设置 左侧找到“Ignore List”,取消勾选"enable Lgnore Listing",并重启chr…

Python Django 连接 PostgreSQL 操作实例

更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 Python Django 连接 PostgreSQL 操作实例,全文3500字,阅读大约10分钟 在Web开发中,使用Django连接到PostgreSQL数据库是一种常见的选择。…

87 GB 模型种子,GPT-4 缩小版,超越ChatGPT3.5,多平台在线体验

瞬间爆火的Mixtral 8x7B 大家好,我是老章 最近风头最盛的大模型当属Mistral AI 发布的Mixtral 8x7B了,火爆程度压过Google的Gemini。 缘起是MistralAI二话不说,直接在其推特账号上甩出了一个87GB的种子 随后Mixtral公布了模型的一些细节&am…

【TB作品】51单片机,语音出租车计价器

西交大题目 1.语音出租车计价器 一、功能要求: 1.具有可模拟出租车车轮转速传感器的硬件设计,可计量出租车所走的公 里数。 2.显示和语音播报里程、价格和等待红灯或堵车的计时价格: 3.具有等待计时功能 4.具有实时年月日显示和切换功能。 5.操作简单、界面友好。 二、设计建议…

Jenkins----基于 CentOS 或 Docker 安装部署Jenkins并完成基础配置

查看原文 文章目录 基于 CentOS7 系统部署 Jenkins 环境基于 Docker 安装部署 Jenkins环境配置 Jenkins 中文模式配置用户名密码形式的 Jenkins 凭据配置 ssh 私钥形式的 Jenkins 凭据配置 Jenkins 执行任务的节点 基于 CentOS7 系统部署 Jenkins 环境 (1&#xff…

解决:AttributeError: module ‘scipy.misc’ has no attribute ‘imsave’

解决:AttributeError: module ‘scipy.misc’ has no attribute ‘imsave’ 文章目录 解决:AttributeError: module scipy.misc has no attribute imsave背景报错问题报错翻译报错位置代码报错原因解决方法方法一 scipy版本回退(不推荐&#…