一、Activity为Android系统中四大组件之一,是Android程序的呈现层,并通过界面与用户进行交互,因此理解Activity源码是有必要的。

二、之前我写过一篇文章:http://blog.csdn.net/u012561176/article/details/49924569 这篇文章介绍了如何导入Android的源码,因为我导入进来了,所以直接就打开查看了。

三、查看Activity的源代码,并找出与它相关的父类:
(1)、Activity类的源码放在android.app包下,打开Activity.class类,源码中有很多英文的注释,注释可以帮助我们理解,但是我英文不好,看不懂,但是无所谓,可以翻译,但是我是直接看代码,源码中类与类之间的相关性很大,所以大家要耐心点。

(2)、打开后如下图所示:

之所以我使用截图,是因为源代码太多了,附上来估计都晕了,而且我截图截那么少,是因为这个类是一个子类,继承ContextThemeWrapper父类,实现了一些接口,如OnCreateContextMenuListener接口,此接口为创建内容菜单的监听器。

(3)、由上面一点可以知道Activity是继承于ContextThemeWrapper父类的,所以此时要打开ContextThemeWrapper类,那我们怎么知道此类位于哪个包呢?我们可以在Activity.class文件里把鼠标移过去,就知道它是位于哪个包下,此类位于android.view包下,打开此类如下图所示:

由上图可知,ContextThemeWrapper类继承ContextWrapper类。

(4)、由上面一点可知,ContextThemeWrapper类为ContextWrapper类的子类,所以此时就要打开ContextWrapper类,此类位于android.content包下,打开后如下图所示:

由上图又可知,ContextWrapper类继承Context类。

(5)、由上面一点可知,ContextWrapper类为Context类的子类,因此打开Context类,此类也是位于android.content包下,打开后如下图所示:

由图可知,此类为一个抽象类,此类用关键字abstract声明了,并且Context类定义了一个或多个抽象的方法,而这些方法只有方法声明,没有方法体。

四、根据Activity的源代码,我们可以得到这样一幅图,来表示类与类之间的关系:

所以可以得出Activity类的祖先是Context类。
比如我们的MainActivity类,继承Activity类,我们可以在MainActivity类里面调用Context类的抽象方法和获取Context类的常量,因为MainActivity继承Activity类,然后Activity类的祖先又为Context类,所以就可以调用Context类的方法和获取Context类的常量。

五、此时我们来仔细观察下Context类的一些代码:
(1)、Context类的常量定义:

 public static final int MODE_PRIVATE = 0x0000;public static final int MODE_WORLD_READABLE = 0x0001;public static final int MODE_WORLD_WRITEABLE = 0x0002;......

还有其它一些常量就不附代码了,上述代码中都是访问模式,比如私有的模式,可读、可写的模式,其中可读、可写的模式已经过时了,并且定义的都为16进制,在代码实现中可以转换十进制,比如Context.MODE_PRIVATE可以用0表示。

(2)、Context类无参的抽象方法:

public abstract AssetManager getAssets();
public abstract Resources getResources();
public abstract PackageManager getPackageManager();
public abstract ContentResolver getContentResolver();
......

还有一些无参的抽象方法就省略了,其中第一个为获得Assets目录的方法,第二个为获得Resources的方法,就不介绍了,在我们编程中常用到的为getResources()方法,用这个方法获得一个Resources对象,然后利用此对象获得strings.xml等资源文件的内容。

(3)、Context类有参的方法、抽象方法:

    public final CharSequence getText(int resId) {return getResources().getText(resId);}public final String getString(int resId) {return getResources().getString(resId);}public abstract SharedPreferences getSharedPreferences(String name,int mode);......

还有一些有参的方法省略了,其中上述的getText(int resId)方法可以获取到对应控件的文本内容,其中的getSharedPreferences(String name,int mode)方法可以得到一个SharedPreferences对象,能够保存数据和共享数据,其中第一个参数为保存数据的xml文件名,可不添加后缀,系统默认添加,第二个参数为xml文件的操作模式,即Context.MODE_PRIVATE等模式。

(4)、其中Contex类中方法实现后的对象类又在其它包下,如Resources类等。所以可以看出类与类之间的联系是怎样的。

六、总结:
今天先介绍到这,大家自己可以去看下源码,理解一下,这篇文章主要介绍如何带领大家看源码,然后介绍了Activity的祖先类Context类,并带着大家看了一下里面的一些常量和方法。

七、以上内容仅供大家学习参考,此篇文章是我自己理解学习而来的,写得不好,请见谅,如有错误,请指出,谢谢!

Android学习之Activity源码的理解(一)相关推荐

  1. android源码编译 简书,android学习笔记之源码编译

    编译环境 1.需要Ubuntu 64bit,建议Ubuntu14.04 64-bit 2.安装openJDK7 $ sudo apt-get update $ sudo apt-get install ...

  2. android 点击事件消费,Android View事件分发和消费源码简单理解

    Android View事件分发和消费源码简单理解 前言: 开发过程中觉得View事件这块是特别烧脑的,看了好久,才自认为看明白.中间上网查了下singwhatiwanna粉丝的读书笔记,有种茅塞顿开 ...

  3. 结合源码深入理解Android Crash处理流程

    应用程序crash在开发过程中还是很常见的,本文主要是从源码的角度去跟踪下Android对于crash的处理流程.App crash的全称:Application crash.而Crash又分为:na ...

  4. android 三方_面试官送你一份Android热门三方库源码面试宝典及学习笔记

    前言 众所周知,优秀源码的阅读与理解是最能提升自身功力的途径,如果想要成为一名优秀的Android工程师,那么Android中优秀三方库源码的分析和理解则是必备技能.就拿比较热门的图片加载框架Glid ...

  5. Android OpenGL ES 学习(十) – GLSurfaceView 源码解析GL线程以及自定义 EGL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  6. Android主流三方库源码分析(九、深入理解EventBus源码)

    一.EventBus使用流程概念 1.Android事件发布/订阅框架 2.事件传递既可用于Android四大组件间通信 3.EventBus的优点是代码简洁,使用简单,事件发布.订阅充分解耦 4.首 ...

  7. Android线程和线程池(二)HandlerThread学习记录 使用+源码

    HandlerThreadAndroid线程和线程池(二)HandlerThread学习记录 使用+源码 一.作用 二.工作原理 三.HandlerThread的特点 优势: 劣势: 四.使用 五.源 ...

  8. 140款Android开源优秀项目源码

    140款Android开源优秀项目源码 BeautifulRefreshLayout-漂亮的美食下拉刷新 https://github.com/android-cjj/BeautifulRefresh ...

  9. Android上百实例源码分析以及开源分析集合打包

    感谢网友banketree的收集,压缩包的内容如下: 1.360新版特性界面源代码 实现了360新版特性界面的效果,主要涉及到Qt的一些事件处理与自定义控件.但源码好像是c++. 2.aidl跨进程调 ...

最新文章

  1. xp大容量u盘补丁_Win XP系统下载与安装(U盘)
  2. jupyter notebook配置
  3. VC6在64位Win7下调试无法退出的问题(缺少TLLOC.DLL和DM.dll)
  4. dos 删除文件夹 rd
  5. 蓝桥杯——快速排序(2018JavaB组第5题9分)
  6. 造成内存泄漏_如何造成内存泄漏
  7. 01背包怎么不重复_带有重复物品的背包
  8. php smarty thinkphp,用新版的thinkphp3.2.3和新版的smarty3.1.29
  9. “深度学习已死,可微编程万岁!”LeCun老师为何又语出惊人?
  10. 怎么给服务器部署php探针,phpStudy学习之php探针
  11. pthread_create创建线程后是否需要释放资源
  12. VBS写出有趣的整人代码
  13. Chrome开发者工具不完全指南:(三、性能篇)
  14. 酒店客房管理系统总结
  15. 专属圣诞树+2022跨年HTML(腾讯云部署)
  16. win10怎么更新显卡驱动_如何更新电脑的显卡驱动(驱动精灵)
  17. php全角数字转半角,php代码中全角数字如何转半角
  18. 第四章:分支结构程序设计
  19. Spel spring表达式
  20. adobe cs5全线作品

热门文章

  1. python----流程控制
  2. 关于Windows azure从github上部署项目
  3. CGIC库的移植及使用
  4. 谁能答对这道题?如有兴趣,请留下算法,呵呵~
  5. ASP+XML+JavaScript实现动态无限级联动菜单
  6. 关于table的那些用法(一)
  7. 7-5 日期问题面向对象设计(聚合二) (40 分)
  8. 汉诺塔计算移动次数和消耗体力
  9. idea 使用 springboot框架开发时,自定义创建 yml文件,系统无法识别。yml文件没有spring的小叶子。完美解决
  10. android 进度条图标方形_Android - 条纹进度条实现,调整view宽度仿进度条