Android学习之Activity源码的理解(一)
来源:互联网 发布:json自定义表单 编辑:程序博客网 时间:2024/06/06 03:02
一、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源码的理解(一)
- android学习之Activity的生命周期理解
- Android 源码系列之<九>从源码的角度深入理解Activity的launchModel特性
- 【Android学习总结】之Activity:深入理解、体验Activity的生命周期
- Android学习 ------- Activity理解
- Android学习二之Activity(一)
- Android学习笔记(一)之Activity
- Android 四大组件学习之Activity一
- android基础学习之activity(一)
- Android之Activity生命周期的理解
- Android之理解Activity的启动模式
- Android 源码系列之<一>从源码的角度深入理解ImageView的ScaleType属性
- Android 源码系列之<一>从源码的角度深入理解ImageView的ScaleType属性
- Android 5.1 源码学习之SurfaceFlinger的启动(一)
- 《android 学习》一、Activity的生命周期
- Android学习之Activity的生命周期学习
- Android源码学习之二-Activity如何管理对话框
- Android源码学习之二-Activity如何管理对话框
- 开源的力量--Git中工作区与暂存区的区别
- 蓝桥杯基础练习 字母图形
- java 虚拟机--新生代与老年代GC
- leetcode oj java Remove Nth Node From End of List
- 加入数据库mysql实现android注册登陆功能的客户端服务器源码与解析
- Android学习之Activity源码的理解(一)
- 29,多级指针
- jquery语法(2)操作dom元素的一些函数
- UVALive 5073 Test Case Tweaking
- Linux编程学习路线
- 增强现实(AR)笔记4:ObjectRecognition实操
- HDU ACM 1157 Who's in the Middle
- VC++老是提示“致命错误:无法打开头文件AFXRES.H”怎么回事 提示在另一个编辑器中打开,怎么解决
- 5分钟深入spark运行机制