1.4 Android应用开发的方法
1.4.1 API参考文档的使用
在开发Android应用程序时可以参考SDK中提供的参考文档,其内容包含在Reference标签中。
1.包索引和类索引
参考文档分成两种索引方式。
Package Index(包索引);
Class Index(类索引)。
包索引根据字母顺序列出Android的各个包,每个包中包含若干个类、接口等内容;类索引按照字母顺序列出了所有的类(也包括接口等内容)。在查找一个类的帮助信息时,如果不知道其属于哪个包,则可以先根据类索引进行查找,打开类的帮助后,可以反向得知它属于哪个包。
根据包索引,每一个包中包含的主要内容大致如下所示。
Interfaces(接口类);
Classes(类);
Enums(枚举值);
Exceptions(异常)。
每个包中包含的内容,基本上是Java语言中标准的内容。
Android的参考文档中的类是Android系统API的主要组成部分,主要参考的内容包括了以下的内容。
根据类索引,每一个类中包含的主要内容大致如下所示。
扩展和实现的内容;
按包名的继承(扩展)关系(可用于反向查找这个类所在的包);
Overview(概览);
XML Attributes(XML属性);
Constants(常量);
Constructors(构造方法);
Methods(方法)。
2.类的帮助
在这些帮助内容中,大部分是Java语言的基本语法内容,只有XML Attributes(XML属性)一项是Android专用的。某些重要的类还包含对于类的详细介绍的图表。
例如,Activity类的帮助文档的前面的信息如下所示:
public class Activity
extends ContextThemeWrapper implements ComponentCallbacks KeyEvent.Callback LayoutInflater.Factory View.On CreateContextMenuListener Window.Callback java.lang.Object android.content.Context android.content.ContextWrapper android.view.ContextThemeWrapper android.app.Activity Known Direct Subclasses ActivityGroup, AliasActivity, ExpandableListActivity, ListActivity Known Indirect Subclasses LauncherActivity, PreferenceActivity, TabActivity
从Activity类中可以看出,类的帮助文档主要包含以下一些内容。
public class:表示这是一个公开的类。
extends [……]:标明了这个类继承的父类(Java不支持多继承,因此每个类只有一个唯一的父类),后面的内容表示这个类从祖先开始继承的关系。这里的类使用的是包含了其所在包名称的全名,因此在这里可以得知类及其祖先类属于哪个包。
Implements [……]:标明了这个类实现的接口(可以有多个)。
Known Direct Subclasses [……]:这个类的直接继承者。
Known Indirect Subclasses [……]:这个类的间接继承者。
对于以上的Activity类,可以看出其在android.app包中,直接继承了android.view.ContextThemeWrapper类,并且被ActivityGroup, ListActivity等几个类直接继承,被LauncherActivity等几个类间接继承。
类的介绍的主要内容在后面,主要部分是各个类的方法的说明,这些方法也是在类的使用过程中需要重点关注的内容。
Class Overview (类的介绍) Summary Constants (常量的列表) Inherited Constants (继承的常量的列表,按照继承类的顺序) Public Constructors (公共的构造函数) Public Methods (公共方法的列表) Protected Methods (保护方法的列表) Inherited Methods (继承方法的列表,按照继承类的顺序) (详细的介绍)
类的帮助中一般只列出了自己的常量、方法、XML属性等,对于继承得到的内容(包括方法和常量),按照继承的顺序列出。由于Java类是单继承,因此在这个部分,首先是父类,然后是祖父类,依此类推。
3.XML属性
相比标准的Java帮助,Android中某些类的帮助文档有些特殊,主要区别是包含了XML Attributes(XML属性)一类。XML属性是在各种XML文件中使用的内容。XML属性有些是在布局文件中使用的,也有些在AndroidManifest.xml中使用的,或者在其他的XML文件中使用的。
例如,Button类(android.widget.Button)的参考文档的主要内容如下所示:
public class Button extends TextView java.lang.Object ↳ android.view.View ↳ android.widget.TextView ↳ android.widget.Button Known Direct Subclasses CompoundButton CompoundButton A button with two states, checked and unchecked. Known Indirect Subclasses CheckBox, RadioButton, ToggleButton XML attributes See Button Attributes, TextView Attributes, View Attributes Summary Inherited XML Attributes From class android.widget.TextView From class android.view.View Inherited Constants Public Constructors Inherited Methods
Button类的头部信息和普通的类基本相同,但是包含了XML attributes这样一个特殊的项目。在这里包含了Button Attributes,TextView Attributes,View Attributes,根据类的继承关系可以得知,这其实是自己的属性、父类的属性(Button类的父类是android.widget.TextView)、祖父类的属性(Button类的祖父类是android.view.View)。
Button类没有自己的XML属性,但是其父类和祖父类有,展开Inherited XML Attributes项目的From class android.widget.TextView和From class android.view.View可以得到这些属性的列表。每个属性包含了Attribute Name(属性名称)、Related Method(相关方法)、Description(描述)几个项目。
例如,TextView的几个属性如下所示:
android:text setText(CharSequence) Text to display. android:textColor setTextColor(ColorStateList) Text color.
android:text等表示了属性在XML文件中的名称,setText()等表示了在Java源文件中使用的方法,最右侧的内容是这个属性的描述。
在各个类的帮助中,点击XML attributes中的连接可以查看其详细的内容,这些XML属性的帮助及相关的值可以在android.R.styleable类中查找,这个类也可以直接被调出,方法为:
Package Index => android => android.R.styleable
各个XML属性使用一个整型数组(int[])和整数(int)表示。对于一个具体的属性,其变量名通常使用如下的格式表示:
<应用属性的类名>_<属性名>
例如,styleable类中的如下内容,表示了TextView这个类的各个XML属性的标识:
public static final int[] TextView public static final int TextView_text public static final int TextView_textColor public static final int TextView_width public static final int TextView_height public static final int TextView_autoText public static final int TextView_capitalize
这里的TextView整型数组表示这个属性组,TextView_text、TextView_textColor等整数值表示一个具体的属性。
其中,TextView_capitalize属性的相关帮助内容如下所示:
public static final int TextView_capitalize If set, specifies that this TextView has a textual input method and should automatically capitalize what the user types. The default is "none". Must be one of the following constant values. Constant Value Description none 0 Don't automatically capitalize anything. sentences 1 Capitalize the first word of each sentence. words 2 Capitalize the first letter of every word. characters 3 Capitalize every character. This corresponds to the global attribute resource symbol capitalize. Constant Value: 44 (0x0000002c)
这里列出了属性的值(Value),这些值的本质是整数常量。一般情况下,类似none、sentences等数值名称,也就是在XML文件中所使用的属性值。
由此,在一个XML文件中,与TextView类及其属性相关的内容可以按照如下的方式来描述:
<TextView android:layout_height="wrap_content" android:layout_width="match_parent" android:autoText="false" android:capitalize="none" />
根据这些属性的变量名,可以得知在XML中使用的字符串名称,整数值作为Android中这个属性的标识。
4.接口的帮助
相比各种类的帮助信息,接口(Interface)的帮助信息更加简单一些。一般的接口是需要被实现才能够使用的。
例如,android.view包中的View.OnClickListener的帮助信息前面的内容如下所示:
public static interface View.OnClickListener android.view.View.OnClickListener Known Indirect Subclasses CharacterPickerDialog, KeyboardView
这里的android.view.View.OnClickListener表示了View.OnClickListener这个接口在android.view这个包中。对于一个接口,Indirect Subclasses的含义为实现(implements)这个接口。
View.OnClickListener的帮助信息后面的内容同样列出这个接口中包含的成员方法,如下所示:
Summary Public Methods abstract void onClick(View v) Called when a view has been clicked.
这些方法是要求接口的实现者来实现的,如果一个类实现了View.OnClickListener这个接口,其中就必须要有这个接口的onClick()函数。
1.4.2 Android应用开发模式
1.开发起点和方式
Android的应用程序开发可以从Android系统的参考实例开始,这些参考实例在SDK各个版本中均有包含。它们对于了解Android程序的基本结构、各种接口的使用有着巨大的帮助作用。例如:SkeletonApp示例程序为一个基本的应用程序的骨架,ApiDemo示例程序中包含了很多基本API的使用,其他示例程序为较为复杂和专用的程序。
在开发Android应用程序的时候,一般需要使用Android参考文档和示例代码结合使用的方式。需要首先了解解除耦合性之后基础功能的实现,将各个方面的基本功能进行排列组合后,一般可以得到根据需求实现的功能。
开发Android应用程序需要具有的两个方面的基础为:
标准Java程序的编写;
Android应用程序结构。
标准Java程序的编写方面属于比较成熟的技术,具有大量的参考资料。由于语法的类似性,有一定的C或者C++基础的开发人员也可以快速进入Java程序开发,主要的差别在于Java提供的各种的类库使用问题上。
Android应用程序结构方面,需要了解Android应用程序源代码的组成格式(工程描述文件、源代码、资源文件)、编译流程,生成的APK包的格式。这些内容通过一个类似SkeletonApp简单程序即可了解。
2.开发的主体脉络
在从事Android应用程序开发的时候,最好先根据一定脉络把握住Android系统应用程序开发的主体方面。在这条主线之上会涉及很多应用程序开发的各种API和相关技巧。
主体脉络可以分成三个阶段:
第一阶段,熟悉UI部分的开发;
第二阶段,熟悉非UI部分的开发;
第三阶段,全面熟悉各种API。
在UI部分开发阶段,各个不同系统开发具有相通的地方,一般从三个方面来进行学习:UI程序结构、各种控件及其布局、图形接口(GDI)。在学习Android的时候,可以使用这种通用UI程序开发方法,在宏观上不牵涉Android本身的系统结构和API结构。按照通用的方式构建一个主线,当然在微观方面,无法回避Android的具体实现。
三个方面在Android中的具体体现如下。
UI程序结构:活动、视图、控件事件、设备事件、UI跳转、对话框、菜单、标题栏、样式等方面。
各种控件及其布局:Android中的控件结构、基本控件、自定义控件、Android的UI布局原理、Android中的各种布局、Android中的自适应视图、多页面集成。
图形接口方面:2D图形程序的结构、2D的图像图形文本绘制、2D特殊效果、3D图形接口的程序结构、OpenGL 3D动画、交互式3D、Android中的可绘制内容、Android中的动画。
提示:在以上的各个和UI相关的内容中,除了特别注明“Android”的之外,其他都是GUI系统的通用名词。
在非UI部分开发阶段,Android系统具有自身的特点,涉及的方面比较多。首先需要从其主体部分进行了解,也就是Android非UI部分的程序结构。主要的内容是服务、广播接收器、内容提供者这三种非UI的组件,Android的工程描述文件,Android的资源和资产。
在全面熟悉各种API阶段,首先需要根据Android API结构,了解熟悉各个包及其主要的功能。其中,Android中比较特定的几个方面为:权限问题、数据存储问题、各种与硬件相关的接口、用户通知方式等。
显然,学习Android开发是几个方面交替进步、互相促进的过程,各个方面之间并不是完全独立的,需要平衡主线和全面了解API二者的关系。