当前位置: 移动技术网 > 移动技术>移动开发>Android > 了解关于Android-Context的含义和使用实例

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

2018年11月25日  | 移动技术网移动技术  | 我要评论

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)是可以的。

\

在应用程序中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中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用,如果使用静态内部类,将外部实例引用作为弱引用持有。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网