【第一课】神奇的Context

初学Android的困惑

初学Android跳转页面的时候,往往教程里是这么写的:

Intent intent = new Intent();
//MyActivity就是当前的Activity,ItActivity就是目标Activity。
intent.setClass(MyActivity.this, ItActivity.class);
startActivityForResult(intent, 0);

当时可能想当然的把setClass()当作是传递了两个class进去,从而实现了class之间的某种“切换”动作。

但是如果你看看这个方法的参数就会发现它原型其实是这样的:

public android.content.Intent setClass(android.content.Context packageContext, java.lang.Class<?> cls)
//两个参数,第一个是Context类型的,第二个才是Class

那么什么是Context呢?为什么传递个MyActivity.this就相当于传递了Context呢?这些疑问先放到一边,我们先来看另一个困惑:

初学者常常会在某个Activity里写了太多太多的代码,其实心中是向往着“面向对象”的,也希望把很多复杂的逻辑功能封装成一个外部类,而不是写在Activity里面,搞很多内部类、内部函数。但阻碍这一想法的往往是写在外部类里怎么调用startActivity(),就好像新建了一个外部的类之后,就与Android断绝了某种联系了似的变成了一个独立的java代码块。

这些困惑的主要原因就是对Android理解不够深入,对Context还不了解。

字面理解Context

Context直接翻译成汉语可以翻译成:环境变量、上下文、来龙去脉。

只从字面翻译还是很形象的,你可以直接理解为它就是Android的环境。

做个小实验你可以直接在一个Activity里直接写这样一句:

Context context=getApplicationContext();

然后你用得到的这个context,后面加点,让IDE来自动提示你它有哪些方法。
我点几个常见的出来,是不是很眼熟?:

//启动Activity
context.startActivity(…);
//获得本地设置
context.getSharedPreferences(…);
//启动服务
context.startService(…);
//发送广播
context.sendBroadcast(…);
//获得系统Service(控制设备)
context.getSystemService(…);
//获得资源
context.getResources();
……

你要操作Android的什么?系统管理、组件的开启调用、访问资源应有尽有,想做什么做什么!

这时候,是不是就可以在外部定义各种复杂逻辑的class了?只需通过构造函数传递一个Context,想怎么操作Android都没有问题。

Context的子类

现在你知道了,Context是一个高度抽象的“大环境”。那么为啥Intent传递参数的时候第一个参数是Context,你却可以写一个MyActivity.this呢?

这其实也很容易想到(善于读API和源码的小伙伴不要嘲讽……)。因为Activity和Context是继承关系,如图:


虽然隔了很多代继承,但毕竟是继承,当然可以直接传递Activity对象了(子类的向上转型嘛)。同时,在Activity里自然可以直接用startActivity等等这些成员函数了。

当然,不仅仅Activity了,Service也一样:

ps:这些图都是在官网API文档上截的,英语好的可以直接去看,提高很大的(看得懂的话也就不用看我这个教程了)。

注意两种不同Context

要注意的是,往往说Context有两种:

  • Application Context
  • Activity Context

其实差别就在于生命周期。

Application Context是整个Application的Context,app的进程结束了,Application Context才会结束。

而Activity Context的生命周期和你获取这个Context的Activity相关,这个Activity销毁了,这个Context也失效了。

获取Application Context的方式一般就如上文所说的调用getApplicationContext()方法就好。

获取Activity Context就是构造Intent经常用的MyActivity.this。

所以啊,你想,用Intent实现跳转的时候,这个Context只用一次就好,所以直接写MyActivity.this没有问题,但是你要是想在Activity外独立一个Class用Context实现很多很多事,又不确定这个Activity会不会被结束掉,还是乖乖地getApplicationContext()来获取一个“全局的”Context好了。

总结

总的来说,Context很强大也很神奇,你就放心地写你的java代码,有Context的地方就有Android。

原文来自博客:【第一课】神奇的context

by:cyhhao http://blog.zhusun.in/cyhhao/

时间: 2024-10-28 15:59:25

【第一课】神奇的Context的相关文章

VC++编程之第一课笔记

第一课 Windows程序内部运行原理 API 操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用.这些函数的集合就是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称Windows API. 如Create Window就是一个API函数,应用程序调用这个函数,操作系统就会按照该函数提供的参数信息产生一个相应的窗口. MSG(消息结构体) 结构体定义如下: typedef s

【C++探索之旅】第二部分第一课:面向对象初探,string的惊天内幕

内容简介 1.第二部分第一课:面向对象初探,string的惊天内幕 2.第二部分第二课预告:掀起了"类"的盖头来(一) 面向对象初探,string的惊天内幕 上一课<[C++探索之旅]第一部分第十二课:指针一出,谁与争锋>中,大家辛苦了. 诚然,指针是不容易啃的硬骨头.不过,假以时日,小火慢炖,可以成为一碗上好的骨头汤,对你的C++水平那可是大补. 好了,口水擦一擦,我们正式进入C++探索之旅的第二部分啦,激动不?刚擦完的哈喇子可不要继续流啊. 这一部分的课程称为:C++之

【Web探索之旅】第三部分第一课:server

内容简单介绍 1.第三部分第一课:server 2.第三部分第二课预告:IP地址和域名 第三部分第一课:server 大家好,欢迎来到[Web探索之旅]的第三部分.这一部分有不少原理.还是非常重要的. 这一部分我们会着眼于一个Web site(站点)是怎样工作的,我们会更深入地了解Web背后的网络. 这里的网络是network.泛指Web中的各台机器之间互相"交流". 还记得我们之前将Web形象地比喻成什么吗? 对了,就是一个非常大的蜘蛛网.对于有蜘蛛恐惧的朋友我仅仅能献上我诚挚的歉意

ViewPager图片预览之图片的放大缩小,移动,切换(第一课)连载

1,自由的放大和缩小 2.双击放大与缩小 3.放大以后可以进行自由的移动 4.处理与ViewPager之间的的事件冲突 需要用到的知识点 1.Matrix (图片放大,缩小需要用到矩阵) 2.ScaleGestureDetector(检测用户多指触控时缩放的手势) 3.GestureDetector:检测用户双击时需要做的一些处理 4.事件分发机制(当我们图片放大时,我们的图片是可以左右移动的,在ViewPager左右切换图片,两者会有冲突). -------------------------

sql第一课笔记

这是我看了imooc的视频教程之后重新写的笔记. 虽然之前也是学习过SQL Server数据库,但是也是忘记得差不多了.现在重新捡起来,安装一次数据库练习,使用的是mysql. 第一课是最简单的创建,修改,查看,删除数据库: mysql 有密码之后在命令行登陆 用的是 shell>mysql -u root -p; 提示输入密码: 登陆成功之后,把提示符mysql变成以当前计算机帐户名@主机名 当前数据库的格式:prompt \[email protected]\h \d> prompt命令下

OpenCV 第一课(安装与配置)

OpenCV 第一课(安装与配置) win10,opencv-2.4.13, 安装, vs2013, 配置 下载安装软件 官网OpenCV下载地址下载最新版本,我下载的是opencv.2.4.13,然后解压安装,我写的路径是D:\Program Files.注意本文中绿色标注的要换成你自己的安装路径. 这里得说一点,可能是因为网速太差的原因,昨天晚上下载了几次安装时都提示说"cannott open file'opencv-2.4.13.exe' as archive".我当时一直不明

读书笔记 - 《格鲁夫给经理人的第一课》

这本书对我的启发远远超过其它的企业管理类图书,不愧是资深前辈写的书.虽然名为第一课,实际上对于中层经理人来说,已经不再需要第二课了.这本书从简单的早餐店开始,讲解了管理杠杆率.开会.决策.规划.矩阵组织.激励.绩效.招人.薪酬.培训,以浅显的语言讲解了几乎是一个中层经理人所需理解的全部工作,使我对工作的认识有了大幅度提高,已经基本可以摆脱漫无头绪的状态!这本书准备丢在公司,没事就翻看思考一下,在实践中继续深入领悟!

EasyUI入门第一课

首先下载easyUI,最好是最新的,然后新建一个空web程序或是网站,不废话,代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="JqueryEasyUI.WebForm1" %> <!DOCTYPE html> <html xmlns="http://ww

第一课 C语言简明教程

1序言: 1与Java.C#等高级语言相比,C语言却非常简单,学习简单,使用也简单,但是也非常重要,到目前为止基本上操作系统的内核代码超过百分之九十使用C语言完成,因此学好C语言是学好计算机这门课程的基础,特别是进入系统编程尤为明显. 今天是本人复习C语言课程的第一课,主要重新记录一下C语言的基础知识,这节课涉及到C语言的结构.变量以及类型.输入输出.条件判断以及循环知识. 2知识点: 2.1 C语言的结构 2.1.1 通常情况下C语言程序是由: 1.相关的代码注释,使用/* ··· */可注释