上一章我们创建了Hello Word项目,代码是由ADT插件自动生成的,我们没有对其进行编码,所以没有对其框架进行分析。其实每一个平台都有自己的结构框架,所以我们对Android项目的结构也进行分析。
与一般的Java项目一样,src文件夹是项目的所有包及源文件(.java),res文件夹中则包含了项目中的所有资源,比如:程序图标(drawable)、布局文件(layout)、常量(values)等。
AndroidMainfest.xml文件则包含了该项目中所有的Activity、Service、Receiver,我们先来打开HelloWord项目中的AndroidMainfest.xml文件,如代码清单所示:
intent-filter 描述了Activity启动的位置和时间。每当一个Activity(或者操作系统)要执行一个操作时,它将创建出一个Intent的对象,这个Intent对象能承载的信息可描述你想做什么,你想处理什么数据,数据的类型,以及一些其他信息。而Android则会和每个Application所暴露的intent-filter的数据进行比较,找到最合适Activity来处理调用者所指定的数据和操作。
AndroidMainfest.xml分析
mainfest | 根节点,描述了package中所有的内容 |
xmlns:android | 包含命名空间的声明。xmlns:android="http://schemas.android.com/apk/res/android",使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。 |
package | 声明应用程序包 |
application | 包含package中application级别组件声明的根节点。此元素也可包含application的一些全局和默认的属性,如标签、icon、主题、必要的权限等等。一个mainfest能包含零个或一个此元素(不能大于一个) |
android:icon | 应用程序图标 |
android:label | 应用程序名字 |
Activity | 用来与用户交互的主要工具。Activity是用户打开一个应用程序的初始页面,大部分被使用到的其他页面也由不同的Activity所实现,并声明在另外的Activity标记中。注意,每一个Activity必须有一个<activity>标签对应,无论它给外部使用或是只用于自己的package中。如果一个Activity没有对应的标记,你将不能运行它。另外,为了支持运行时查找Activity,可包含一个或多个<intent-filter>元素来描述Activity所支持的操作。 |
android:name | 应用程序默认启动的Activity |
intent-filter | 声明了指定的一组组件支持的Intent值,从而形成了IntentFilter。除了能在此元素下指定不同类型的值,属性也能放在这里来描述一个操作所需要的唯一的标签、icon、和其他信息。 |
action | 组件支持的Intent action |
category | 组件支持的Intent Category。这里指定了应用程序默认启动的Activity |
下面我们看看资源文件中一些常量的定义,如String.xml,代码清单如下所示:
这个文件很简单,就定义了两个字符串资源,因此,我们可以在代码清单AndroidMainfest.xml中,那怎样使用我们自己定义的这些资源文件呢?首先,通过Context的getResources实例化一个Resources对象,然后通过Resources的getString方法取得指定索引的字符串,代码如下:
Resources resources = this.getApplicationContext().getResources(); String appName = resources.getString(R.string.app_name); String hello = resources.getString(R.string.hello);
项目中所有使用的常量都可以通过这种XML文件的方式定义,比如,下面是我们通过XMl文件定义一些有关颜色的资源。
现在来分析项目中的布局文件(layout),首先打开res -> layout -> main.xml文件,代码如下:
上述代码清单中,有以下几个布局和参数。
1).<LinearLayout>:线性布局,在这个标签中,所有元件都是按照由上往下的排列排成的
2).android:orientation:表示这个介质的版面配置方式,其中“vertical”代表从上到下垂直布局,而“horizontal”代表从左到右水平布局。
3).android:layout_width:定义当前视图在屏幕上所占的宽度,match_parent即填充整个屏幕。
4).android:layout_height:定义当前视图在屏幕上所占的高度,match_parent即填充整个屏幕。
5).wrap_content:随着文字栏位的不同而改变这个视图的宽度和高度。
6).layout_weight:用于给一个线性布局中的多个视图的重要度赋值。所有视图都有layout_weight值,默认为零,即需要显示多大的视图就占据多大的屏幕空间。如果值大于零,则将父视图中的可用空间分割,分割大小具体取决于每一个视图的layout_weight值和该值在当前屏幕布局的整体layout_weight值,以及在其他视图屏幕布局layout_weight值中所占的比例。
7).android:text:设置这个TextView控件的文字内容。
8).@string/hello:这是调用XML中字符串资源。
最后,我们来分析项目中主程序文件MainActivity.java,代码清单如下所示:
主程序MainActivity类集成自AppCompatActivity类,重写的onCreate(...)方法。在onCreate方法通过setContentView(R.layout.activity_main)设置Activity要显示的布局文件(\layouyt\activity_main)。