欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

了解关于Android-Context的含义和使用实例

程序员文章站 2022-05-14 08:25:49
context的中文翻译为:语境; 上下文; 背景; 环境,在开发中我们经常说称之为“上下文”,那么这个“上下文”到底是指什么意思呢?在语文中,我们可...

context的中文翻译为:语境; 上下文; 背景; 环境,在开发中我们经常说称之为“上下文”,那么这个“上下文”到底是指什么意思呢?在语文中,我们可以理解为语境,在程序中,我们可以理解为当前对象在程序中所处的一个环境,一个与交互的过程。比如微信聊天,此时的“环境”是指聊天的界面以及相关的数据请求与传输,context在加载资源、启动activity、获取系统服务、创建view等操作都要参与。一个activity就是一个context,一个service也是一个context。android程序员把“场景”抽象为context类,他们认为用户和操作系统的每一次交互都是一个场景,比如打电话、发短信,这些都是一个有界面的场景,还有一些没有界面的场景,比如后台运行的服务(service)。一个应用程序可以认为是一个工作环境,用户在这个环境中会切换到不同的场景,这就像一个前台秘书,她可能需要接待客人,可能要打印文件,还可能要接听客户电话,而这些就称之为不同的场景,前台秘书可以称之为一个应用程序。一个android应用程序,可以理解为一部电影或者一部电视剧,activity,service,broadcast receiver,content provider这四大就好比是这部戏里的四个主角:胡歌,霍建华,诗诗,baby。他们是由剧组(系统)一开始就定好了的,整部戏就是由这四位主演领衔担纲的,所以这四位主角并不是大街上随随便便拉个人(new 一个对象)都能演的。有了演员当然也得有摄像机拍摄啊,他们必须通过镜头(context)才能将戏传递给观众,这也就正对应说四大组件(四位主角)必须工作在context环境下(摄像机镜头)。那button,textview,linearlayout这些控件呢,就好比是这部戏里的配角或者说群众演员,他们显然没有这么重用,随便一个路人甲路人乙都能演(可以new一个对象),但是他们也必须要面对镜头(工作在context环境下),所以button mbutton=new button(context)是可以的。

了解关于Android-Context的含义和使用实例

在应用程序中context的具体实现子类就是:activity,service,application。那么context数量=activity数量+service数量+1。当然如果你足够细心,可能会有疑问:我们常说四大组件,这里怎么只有activity,service持有context,那broadcast receiver,content provider呢?broadcast receiver,content provider并不是context的子类,他们所持有的context都是其他地方传过去的,所以并不计入context总数。上面的关系图也从另外一个侧面告诉我们context类在整个android系统中的地位是多么的崇高,因为很显然activity,service,application都是其子类,其地位和作用不言而喻。

context能干什么

弹出toast、启动activity、启动service、发送广播、操作等等都需要用到context。

如何获取context

通常我们想要获取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也可以。

view持有activity引用

有一个静态的drawable对象当imageview设置这个drawable时,imageview保存了mdrawable的引用,而imageview传入的this是mainactivity的mcontext,因为被static修饰的mdrawable是常驻内存的,mainactivity是它的间接引用,mainactivity被销毁时,也不能被gc掉,所以造成内存泄漏。

正确使用context

一般context造成的内存泄漏,几乎都是当context销毁的时候,却因为被引用导致销毁失败,而application的context对象可以理解为随着进程存在的,所以我们总结出使用context的正确姿势:

1:当application的context能搞定的情况下,并且生命周期长的对象,优先使用application的context。

2:不要让生命周期长于activity的对象持有到activity的引用。

3:尽量不要在activity中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用,如果使用静态内部类,将外部实例引用作为弱引用持有。