小白上手第二弹——浅析Context

Android之window机制token验证 前言 很高兴遇见你~ 欢迎阅读我的文章 这篇文章讲解关于window token的问题,同时也是Context机制和Window机制这两篇文章的一个补充。如果你对Android的Window机制和Context机制目前位了解过,强烈建议你先阅读前面两篇文章,可以帮助理解整个源码的解析过程以及对token的理解。同时文章涉及到Activty启动流程源码,读者可先阅读Activity启动流程这篇文章。文章涉及到这些方面的内容默认读者已经阅读且了解,不会对这方面的内容过多阐述,如果遇到一些内容不理解,可以找到对应 阅读详情

转载请注明文章出处http://blog.youkuaiyun.com/Neo___/article/details/51760151

经过一段时间的学习我感觉对Android是越来越感兴趣了,不知道你是否也是呢。Context这个东西比较抽象,虽然官方的意思是叫上下文,但是上下文又是什么呢?你可以暂且将它理解为“场景”,你在Android里面做的大多数事情都是需要一个场景来提供和支持你所需要的程序和数据,这段时间总是被Context的问题所困惑,那么我现在就以一个小白的角度去讲解Context。
参考文章:http://blog.youkuaiyun.com/lmj623565791/article/details/40481055
http://blog.youkuaiyun.com/race604/article/details/9331807
http://blog.youkuaiyun.com/z1074971432/article/details/12561369

Context是什么

首先,我们先创建一个类,然后让它去继承自Context,去观察它的继承树从而了解它的本质。创建一个类点击它,然后按住F4就会显示它的继承树,如图:
这里写图片描述
从图中我们可以发现它的继承关系,并且发现了两个很眼熟的东西,Activity和Service,这也证实了为什么我们在Activity中需要传入context参数的时候,我们只需要传入一个this,因为Activity本身就是Context!准确点说,Context是个抽象类,而ContextWrapper实现了它所有的方法,然后Application、Service、ContextThemeWrapper等类又去继承了ContextWapper,而Activity又通过继承ContextThemeWrapper实现了Context,具体关系请看下图:
这里写图片描述
有能力的同学可以直接看源码,可以更加深入地了解Context的内部构造。

this和XXXActivity.this的区别

一眼看上去,this和XXXActivity.this都是this,没有什么区别,只是后者多了一个ClassName,他们的作用到底体现在哪里呢,我们常常发现,在使用this的时候往往是在Activity的本身类当中,如果使用XXXActivity.this的时候往往是在嵌入类(匿名内部类,内部类)当中,如下图所示:
这里写图片描述
这是因为嵌入类当中的this指的是嵌入类本身,而不是当前类,所以需要ClassName的引用,而当前类中的this指的就是当前类本身的Context,所以在当前类中使用context的时候,直接传this就可以了。

getActivity()和getApplicationContext()的区别

我们知道getActivity()获取的是当前Activity的Context,而getApplicationContext()获取的是Applicaiton级别的Context,他们的级别不一样,作用域也不一样,而涉及UI相关的功能的时候,只有Activity的Context能去处理,其他的Context实例都是差不多的,比如空token问题——Unable to add window(token noll is not for an application),出现这个问题是因为你在进行UI方面的操作的时候传入的context是有问题的,或者是windowManager.layoutParams中缺少参数详情参考http://blog.youkuaiyun.com/springsky_/article/details/7034339;
上面的链接是解决参数的问题,但是根本原因是因为传入的context实例不是当前Activity,如图所示:
这里写图片描述
上图是通过当前Activity获取到的Application的Activity,结果出现空token异常,如果改成getActivity()则异常消除,如果同一个问题有不同的解决办法,为什么不选这个简单的呢。

Fragment中获取Activity的Context

Fragment是个好东西,初次接触Fragment的小白肯定也和我一样激动不已,恨不能眨眼就想学会它然后投入应用,但是在应用的过程中,总是会出现这样那样的问题,比如,在Fragment和Adapter结合使用的时候在构造函数中需要传入Context参数,这个参数传什么呢?Fragment没有实现Context,所以传入this肯定是不行的,我们可以通过getActivoty()或者getApplication()方法获取Context,但是就应用性而言getActivity()是比较好的,因为在Fragment中不免会涉及UI操作,但是有时会出现空指针异常,NullPointerException,很有可能是因为你的context在onActivityCreated()的外面从而导致你的context没有获取到,如图:
这里写图片描述
上图所示才是正确的获取方式,因为Fragment的生命周期中,在Activity和Fragment的关联创建完毕之后才会调用onActivityCreated()方法,这个时候我们要想获取Activity的实例必须得在重写的这个方法中获取,否则就会出现空指针异常。

获取全局Context

有的时候可能根据我们的需求不同,我们需要获取到全局Context,这样使用起来比较方便,那么怎么才能获取到全局Context呢,其实很简单,我们可以定制一个自己的Application泪来管理我们的一些全局状态的信息,首先我们需要创建一个MyApplication类继承自Application`public class MyApplication extends Application {
private static Context context;

public MyApplication()  {
    // TODO Auto-generated constructor stub 
}
@Override
public void onCreate() {
    // TODO Auto-generated method stub
    context = getApplicationContext();
}
public static Context getContext(){
    return context;

}

}`
我们只需重写父类的onCreate()方法,并通过调用getApplicationContext()方法得到了一个Application级别的Context,然后写入一个getContext()将获取到的Context返回。然后我们需要告知系统程序启动的时候需要初始化MyApplication类,只需要在AndroidManifast的application标签下写入:name=”包名.MyApplication“就可以了,这样我们就实现了一种全局获取Context的机制,之后不管你想在项目的任何地方使用Context,只需要调用一下MyApplicaiton.getApplication()方法就可以了。

最后,祝大家学习进步!在Android的道路上越走越远!

浅析Android的Context 欢迎访问我的个人网站:https://coderyuan.com Context是Android App中用的非常多的一种概念,常被翻译成上下文,这种概念在其他的技术中也有所使用,无意间点了Context的源码,那么就来分析分析Context在Android中到底是什么东西? 先贴段代码 /** * Interface to global information about an ... 阅读详情

相关推荐

浅析Context及可能带来的内存泄漏问题

什么是 Context纯英文含义来看,Context 意指上下文、环境、背景等等……那么 Android 中的 Context 的含义和这些英文释义有什么联系呢?不妨看看 Google 给出的定义: Interface to global information about an application environment. This is an abstract class whose i

追风筝的吃货,汪~ 5788

context是什么意思

context上下文吗,可以解释为程序运行的某一区间之内,提供对这一区间之内操作的一种对象,而且往往这一区间之内得核心操作都需要这个对象来进行 把Context翻译成“上下文”只是不直观罢了,不过也没大错。我们来看看中文的“上下文”是什么意思。我们常说听话传话不能“断章取义”,而要联系它的“上下文”来看。比如,小丽对王老五说“我爱你”,光看这句还以为在说情话呢。但一看上下文...

weixin_30925411的博客 786

Golang:浅析Context包

在golang官方文档中是这样介绍context包的:在context包中定义了context类型来在不同的Goroutine 之间传递上下文,携带截止时间、取消信号以及携带上下文的系统参数(k-v)的类型。对服务器的传入请求应该创建上下文,对服务器的传出调用应该接受上下文。它们之间的函数调用链必须传播上下文,可以选择将其替换为使用WithCancel、WithDeadline、WithTimeout或WithValue创建的派生上下文。

Leroy的博客 537

关于Android的一个常见错误:Unable to add window

关于android的一个常见错误:Unable to add window –token is not valid(转载自http://www.aiuxian.com/article/p-383550.html)`Process: com.android.** Flags: 0x9be65 Package: com.android.* v15 (4.0.4) Build: *:4.0.4/IM

yuxing_zhong的专栏 4205

新手也能懂的Simulink汽车二自由度建模:从公式推导到模型搭建全流程

本文为新手提供了在Simulink中搭建汽车二自由度模型的完整实战指南。文章从模型核心概念讲起,详细讲解了如何将车辆动力学方程转化为状态空间模型,并逐步指导在Simulink中实现从参数设置、模块搭建到仿真验证的全过程。通过阶跃转向测试和参数影响分析,帮助读者直观理解车辆转向特性,并提供了实用的模型扩展思路与常见问题排查技巧。

weixin_29047919的博客 215

归因分析计算因子贡献度常见的方法

在归因分析中,我们一般都需要计算出每个因子的贡献度是多少,比如产品DAU上升,对年龄段维度进行拆解,看是不同年龄段的用户对DAU上升的贡献度是多少,一般根据指标的类型,计算贡献度的方法也不一样,下面就列出一些常见的归因分析贡献度的计算方法。

Hubans的博客 4万+

android studio 小白使用记

1.显示行数 2.自动导包设置 3.设置悬浮提示文字框显示函数

tingxuege 668

Jasypt 开源加密库使用教程

Jasypt 加密框架概述 1、Jasypt Spring Boot 为 spring boot 应用程序中的属性源提供加密支持,出于安全考虑,Spring boot 配置文件中的敏感信息通常需要对它进行加密/脱敏处理,尽量不使用明文,要实现这一点,办法有很多,自己手动对敏感信息进行加解密也是可以的。 2、有需求就有人奉献,Jasypt 开源安全框架就是专门用于处理 Spring boot 属性加密的,在配置文件中直接配置密文,然后应用启动的时候,Jasypt 会自动将密码解密成明文供程序使用。 3、

蚩尤后裔-汪茂雄 3万+

浅析Golang的Context

主要介绍了Go语言中context的概念和常见用法,以及context的底层实现原理。

qq_47997583的博客 3133

Qt思岚激光雷达

Qt关于思岚激光雷达研究示例,本示例采用qt界面开发,可以串口也可以tcp进行设备连接。接收数据进行相关的数据进行绘图, 这种雷达可以用于大屏触摸场景,会场互动触摸场景开发。 #ifndef MAINWIDGET_H #define MAINWIDGET_H #include <QTimer> #include <QWidget> #include "lidarmgr.h" namespace Ui { class MainWidget; } class MainWidget.

cqltbe131421的博客 1598

数据库:关系运算整理大全(包括关系代数、元组关系演算、域关系演算)

数据库关系运算: 1. 关系代数(基本关系代数、附加关系代数、扩展关系代数) 2. 元组关系演算 3. 域关系演算

ysji's blog 2万+

浅析Context在常见类的用法

作用: 虽然本文标题为“浅析Context在常见类的用法”,但阅读者可能有不少是对Context感到疑惑的,故在此附述一下其作用和理解。 在Android中凡是一个带有GUI的组件被调用,必然不是普通Java代码那样直接new一个对象实例即可,而是需要一个特定的环境下才能被显示出来。当然,一些特殊的组件例如Service虽然不是GUI形式,但其特殊在于它可以完成很复杂的任务操作(理解为不带GUI的Activity),当Service被调用然后工作时,其需要一个特定的工作环境才能启动。 一些特殊的组件如Toa

kicinio的博客 2749

GEE:关于遥感生态指数(RSEI)的若干疑问

本文记录了若干关于在 Google Earth Engine (GEE)平台上,计算基于主成分分析(PCA)的遥感生态指数(RSEI)的问题。并记录了解决这些问题的一些答案。问题包括,主成分分析的特征值的正负,主成分的占比,去云后空值像素的处理方法,异常值处理方法,如何看载荷等。

养乐多的博客 3417

浅析Android Context

解释了Context的基本含义,Context的继承关系,Context生成的时机以及在应用程序中的个数,辨析了Acticity的Context与Application的Context的不同,它们二者的应用场景,浅析了关于使用Activity的Context引起的内存泄露问题等。

geekerhw的博客 1163

古月学院《如何在Gazebo中实现阿克曼转向车的仿真》课程资料在ROS Noetic版本中运行时的常见错误及解决方法

   最近想在Gazebo中开发一些仿真内容,于是购买了古月学院的《如何在Gazebo中实现阿克曼转向车的仿真》课程,但是由于ROS 版本的更新,拿到手的课程资料不能直接在ROS Noetic版本中运行,经过我这几天的探索,对遇到的错误及解决方法进行了整理,方便后面购买课程的小伙伴更快的成功运行程序    在文章正式开始之前,先放一下我之前为了寻找该资料报错的原因,而写的两篇与该课程相关的文章链接,感兴趣的可以自行阅读    以阿克曼转向车为例对URDF和XACRO文件进行解读(点击可跳转)    将x

慕羽★的博客 5975

RK3568平台YOLO11模型部署实战:从环境搭建、模型转换到板端性能优化全解析

摘要: 本文详细介绍了在RK3568平台上从零部署YOLO11模型的完整流程。主要内容包括:1) 基于Conda搭建Python 3.8开发环境并安装RKNN-Toolkit2工具链;2) 使用LabelImg工具标注数据并构建YOLO格式数据集;3) 基于Ultralytics框架进行YOLO11模型训练及参数优化;4) 实现PyTorch→ONNX→RKNN的完整模型转换链。文章特别针对RK3568平台的NPU特性提供了关键参数配置建议,并分享了实际开发中的经验总结,最终可达到30FPS的稳定推理性能。

LXY_LOVE36的博客 281

context 浅析

在缺少直接调用关系的两个函数之间传递数据,一般都会考虑使用 context,而 context 也被用来存储整个请求链路的公参信息,用户 uid、链路 traceID、特定的业务参数等。函数第一个参数类型设置为 context.Context 也是 Go 的默认写法,如果你对是否指定 ctx 作为函数的第一个入参,感觉到模棱两可,那就指定它吧。

小知识折射大智慧 846

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android 浅析Context

我们平时在开发Android应用程序时一直都在使用Context比如启动一个Activity,大部分人不知道为什么要使用context来启动Activity,不能直接new一个activity而要使用context来启动,一个App到底有多少个Context等等的细节,尤其是Context使用不当还会造成内存泄漏,所以有必要写篇文章总结下。Android应用模型磨刀不误砍柴工,先介绍一下Androi

HJsir的博客 466

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

关于golang的context浅析

首先来看一段关于谷歌官方的描述 Package context defines the Context type, which carries deadlines, cancellation signals, and other request-scoped values across API boundaries and between processes. 大概意思就是: Context ...

Gdl.痕迹 的博客 321

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Context类浅析

Context类浅析Context Context n. 语境; 上下文; 背景; 环境; Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android syst

sshhsun的专栏 1027

浅析Context Class Loader

 浅析Context Class Loader 1 前言对于一般的Java应用而言,类装载器是透明的,我们在做普通的Java桌面应用程序和Web程序的时候也很少会与ClassLoader打交道。但是当我们深入地研究一些WebServer(如Tomcat)的时候,发现里面用到了很复杂的自定义类装载器体系结构,想要了解其工作过程首先就要理解它是如何载如类的。此外,当我们明明在ClassPa

薛笛的专栏 1万+

Android技术分享| Context浅析

【Android】Context浅析 类继承图 我们来看下关于 Context 的类继承图,我们通过查看源码得知,Context 是一个抽象类,所以它肯定有其实现类,查阅得知它的实现类为 ContextWrapper 和 ContextImpl ,所以它的继承图如下: 以上的 Context 类继承关系清晰简洁,可以得知,Application 、 Service 、Activity 都是继承的 Context 类,所以从这里我们可以得知: Context 数量 = Activity 数量 + Serv

anyRTC的博客 446

浅析Context

Context是什么? Context在android中一般被翻译为“上下文”,但是从语义上来看context更应该被理解为“场景”。 一个Context意味着一个场景,一个场景就是用户和操作系统交互的过程。比如,当你打电话的时候,场景包括电话交互界面以及它隐藏在背后的数据。 从代码中可以看出Activity类是基于Context,Service类也是基于Context的。从设计的角度看Ac

242

[并行训练]Context Parallelism的原理与代码浅析

Context Parallelism (CP) 是一种针对Self-attention模块的序列并行方法,主要解决Megatron-LM框架中序列维度并行的难题。其核心思想是通过Flash-attention2分块计算,配合环形通信传递KV值,最终对分块结果进行修正。实现过程包括数据切分、分块attention计算、KV数据环形交换、单步修正和结果合并。CP通过优化causal mask计算和引入FA2修正机制,在保证数学等价的同时提升了计算效率。

InfraTech 739

Android的context浅析

android的context大家会经常用到,无论在显示ui还是某些数据操作都会需要传入context。 按照经验我们知道Activity,service,Application。都可以作为context使用~那么在使用的时候有什么地方要注意,有什么区别呢? 1.乱用context可能会照成内存泄漏, 比如某些单例里面可能会使用到context,而单例又是静态的,生命很长的。

javy_codercoder的博客 565
上一篇: Android利剑之——通知栏提醒
Neo___
博客等级 码龄11年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值