初学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的更多相关文章

  1. NeHe OpenGL教程 第一课:OpenGL窗口

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. Android OpenGL教程-第一课【转】

    第一课 快速的开始一个Android OpenGL项目 首先,读懂我们的教程,需要有android的初步基础,我们这里只是通过android提供的SDK,来进行OpenGL的学习,所以你必须先学习如何 ...

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

    wx_fmt=jpeg" alt="0? wx_fmt=jpeg" style="height:auto"> 内容简单介绍 .第三部分第一课:s ...

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

    内容简单介绍 1.第二部分第一课:面向对象初探.string的惊天内幕 2.第二部分第二课预告:掀起了"类"的盖头来(一) 面向对象初探,string的惊天内幕 上一课<[C ...

  5. Nehe OpenGL教程第一课-创建一个OpenGL窗口(Win32)

       原文英文地址为:Creating an OpenGL Window (Win32),翻译的chm中文格式文档下载地址为:OpenGL教程电子书(chm格式)中文版,源代码在官网上也可以下载到,每 ...

  6. vue.js学习(第一课)

    学习资料 来自台湾小凡! vue.js是javascript的一个库,只专注于UI层面,核心价值永远是 API的简洁. 第一课: 不支持IE8. 1.声明式渲染: el元素的简称 element : ...

  7. Magento学习第一课——目录结构介绍

    Magento学习第一课--目录结构介绍 一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为zen ...

  8. <-0基础学python.第一课->

    初衷:我电脑里面的歌曲很久没换了,我想听一下新的歌曲,把他们下载下来听,比如某个榜单的,但是一首一首的点击下载另存为真的很恶心 所以我想有没有办法通过程序的方式来实现,结果还真的有,而且网上已经有有人 ...

  9. 留念 C语言第一课简单的计算器制作

    留念 C语言第一课简单的计算器制作 学C语言这么久了.  /* 留念 C语言第一课简单的计算器制作 */   #include<stdio.h>  #include<stdlib.h ...

随机推荐

  1. td 自动换行

    Two solutions for cell width:1. Omit words: <td style="width:60px;"><div style=&q ...

  2. JAX-RS(基于Jersey) + Spring 4.x + MyBatis构建REST服务架构

    0. 大背景 众所周知,REST架构已经成为现代服务端的趋势. 很多公司,已经采用REST作为App, H5以及其它客户端的服务端架构. 1. 什么是JAX-RS? JAX-RS是JAVA EE6 引 ...

  3. 解决tkinter在windows上没有正确安装的问题

    问题 Can't find a usable tk.tcl in the following directories: 解决方法 加两个环境变量,在我的机器上是这样的 TCL_LIBRARY=D:\d ...

  4. Lumia 830 win10m 启用触摸按键

    用了一年半的830疑似翘屏… 按键基本失灵 每次按的时候基本都是 appbar 那里有反映… 实在懒于换手机(主要是不想花钱…) 研究下怎么启用虚拟按键,还能再战几年… 启用虚拟按键 其实简单说法就是 ...

  5. CentOS 6.5 EasyPR环境搭建

    EasyPR是一款开源的中文车牌识别系统,项目地址. 在搭建的过程中,主要的问题是注意版本的兼容性,这里面的版本包括:opencv版本,g++版本以及cmake版本. 我使用的EasyPr版本信息如下 ...

  6. POJ-1475-Pushing Boxes(BFS)

    Description Imagine you are standing inside a two-dimensional maze composed of square cells which ma ...

  7. (转)新手必看:HighCharts几个基础问答

    转自:http://bbs.hcharts.cn/article-21-1.html

  8. struts2:struts.xml配置文件详解

    1. 几个重要的元素 1.1 package元素 package元素用来配置包.在Struts2框架中,包是一个独立的单位,通过name属性来唯一标识包.还可以通过extends属性让一个包继承另一个 ...

  9. 如何查看 exec sp_execute 10 XXX, XXXX的RPC事件 内容

    使用事件探查器经常能捕捉到类似于exec sp_execute 10 XXX, XXXX的RPC事件. 我想问下从哪里可以看到存储过程sp_execute 10的内容呢?? 方法如下: 在新建的pro ...

  10. [ linux ] pad远程

    ---恢复内容开始--- ssh: serverauditor vnc:vnc viewer ubuntu: sudo apt-get install x11vnc sudo apt-get inst ...