【第一课】神奇的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://cyhhao.zhusun.in
【第一课】神奇的Context的更多相关文章
- NeHe OpenGL教程 第一课:OpenGL窗口
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Android OpenGL教程-第一课【转】
第一课 快速的开始一个Android OpenGL项目 首先,读懂我们的教程,需要有android的初步基础,我们这里只是通过android提供的SDK,来进行OpenGL的学习,所以你必须先学习如何 ...
- 【Web探索之旅】第三部分第一课:server
wx_fmt=jpeg" alt="0? wx_fmt=jpeg" style="height:auto"> 内容简单介绍 .第三部分第一课:s ...
- 【C++探索之旅】第二部分第一课:面向对象初探,string的惊天内幕
内容简单介绍 1.第二部分第一课:面向对象初探.string的惊天内幕 2.第二部分第二课预告:掀起了"类"的盖头来(一) 面向对象初探,string的惊天内幕 上一课<[C ...
- Nehe OpenGL教程第一课-创建一个OpenGL窗口(Win32)
原文英文地址为:Creating an OpenGL Window (Win32),翻译的chm中文格式文档下载地址为:OpenGL教程电子书(chm格式)中文版,源代码在官网上也可以下载到,每 ...
- vue.js学习(第一课)
学习资料 来自台湾小凡! vue.js是javascript的一个库,只专注于UI层面,核心价值永远是 API的简洁. 第一课: 不支持IE8. 1.声明式渲染: el元素的简称 element : ...
- Magento学习第一课——目录结构介绍
Magento学习第一课--目录结构介绍 一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为zen ...
- <-0基础学python.第一课->
初衷:我电脑里面的歌曲很久没换了,我想听一下新的歌曲,把他们下载下来听,比如某个榜单的,但是一首一首的点击下载另存为真的很恶心 所以我想有没有办法通过程序的方式来实现,结果还真的有,而且网上已经有有人 ...
- 留念 C语言第一课简单的计算器制作
留念 C语言第一课简单的计算器制作 学C语言这么久了. /* 留念 C语言第一课简单的计算器制作 */ #include<stdio.h> #include<stdlib.h ...
随机推荐
- td 自动换行
Two solutions for cell width:1. Omit words: <td style="width:60px;"><div style=&q ...
- JAX-RS(基于Jersey) + Spring 4.x + MyBatis构建REST服务架构
0. 大背景 众所周知,REST架构已经成为现代服务端的趋势. 很多公司,已经采用REST作为App, H5以及其它客户端的服务端架构. 1. 什么是JAX-RS? JAX-RS是JAVA EE6 引 ...
- 解决tkinter在windows上没有正确安装的问题
问题 Can't find a usable tk.tcl in the following directories: 解决方法 加两个环境变量,在我的机器上是这样的 TCL_LIBRARY=D:\d ...
- Lumia 830 win10m 启用触摸按键
用了一年半的830疑似翘屏… 按键基本失灵 每次按的时候基本都是 appbar 那里有反映… 实在懒于换手机(主要是不想花钱…) 研究下怎么启用虚拟按键,还能再战几年… 启用虚拟按键 其实简单说法就是 ...
- CentOS 6.5 EasyPR环境搭建
EasyPR是一款开源的中文车牌识别系统,项目地址. 在搭建的过程中,主要的问题是注意版本的兼容性,这里面的版本包括:opencv版本,g++版本以及cmake版本. 我使用的EasyPr版本信息如下 ...
- POJ-1475-Pushing Boxes(BFS)
Description Imagine you are standing inside a two-dimensional maze composed of square cells which ma ...
- (转)新手必看:HighCharts几个基础问答
转自:http://bbs.hcharts.cn/article-21-1.html
- struts2:struts.xml配置文件详解
1. 几个重要的元素 1.1 package元素 package元素用来配置包.在Struts2框架中,包是一个独立的单位,通过name属性来唯一标识包.还可以通过extends属性让一个包继承另一个 ...
- 如何查看 exec sp_execute 10 XXX, XXXX的RPC事件 内容
使用事件探查器经常能捕捉到类似于exec sp_execute 10 XXX, XXXX的RPC事件. 我想问下从哪里可以看到存储过程sp_execute 10的内容呢?? 方法如下: 在新建的pro ...
- [ linux ] pad远程
---恢复内容开始--- ssh: serverauditor vnc:vnc viewer ubuntu: sudo apt-get install x11vnc sudo apt-get inst ...