3.2 And roid工程剖析
工程创建完成之后,需要剖析一下Android工程。
3.2.1 Android工程目录结构
使用Android Studio工具开发Android应用程序,创建的工程目录结构比较复杂,开发人员应该清楚各个目录下面放置的是什么东西。工程根目录下有app和Gradle Scripts, app是应重点关注的,app下面的主要目录有manifests、java和res。
manifests目录中的AndroidManifest.xml是当前Android应用程序的清单文件,记录应用中所使用的各种组件,java是Java源代码目录,res是资源目录。下面重点介绍一下res目录。
res资源目录中存放所有程序中用到的资源文件。“资源文件”指的是布局文件、图片文件和配置文件等。子目录主要有drawable、layout、mipmap和values。
❏ drawable。存放一些应用程序需要用的图片文件(*.png和*.jpg等)。
❏ layout。屏幕布局目录,layout目录中放置的是布局文件,布局文件是Xml文件。
图3-8 工程目录结构
❏ mipmap。与drawable一样存放资源图片,在Android 2.2后增加目录,Android系统会对mipmap做了一些优化,加快了图片的渲染速度,提高的图片质量,减少GPU的压力。
❏ values。参数值目录,存放软件所需要显示的各种文字和一些数据。可以在这个目录下的strings.xml中存放各种文字,还可以存放不同类型的数据,例如colors.xml、dimens.xml和styles.xml等。
另外,为了适配不同的设备,res资源目录中的drawable、layout、mipmap和values等资源目录,可以分别有多个,图3-9是在Windows资源管理器中看到的目录结构,其中mipmap有5个不同的目录:
图3-9 Windows资源管理器目录结构
❏ mipmap-mdpi。放置中质量图片。
❏ mipmap-hdpi。放置高质量图片,是mipmap-mdpi尺寸的1.5倍。
❏ mipmap-xhdpi。放置超高质量图片,是mipmap-mdpi尺寸的2倍。
❏ mipmap-xxhdpi。放置超高质量图片,是mipmap-mdpi尺寸的3倍。
❏ mipmap-xxxhdpi。放置超高质量图片,是mipmap-mdpi尺寸的4倍。
3.2.2 R.java文件
访问res目录中的资源文件,并不能通过Java IO技术实现,而是通过R.java文件访问。R.java文件是在工程编译时候自动产生的R类。
R.java文件可参考如下代码:
package com.a51work6.helloandroid; public final class R{ … public static final class mipmap{ public static final int ic_launcher=0x7f030000; } public static final class layout{ public static final int activity_main=0x7f030000; } public static final class string{ public static final int app_name=0x7f040001; … } }
R类中包含很多静态类,且静态类的名字都与res中的一个目录名字对应,就像是资源字典大全,包含了用户界面、图像、字符串等对应于各个资源的标识符,R类定义了该项目所有资源的索引。例如,在程序代码中访问activity_main.xml布局文件,可以通过表达式R. layout.activity_main访问,示例代码如下:
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
R类还可以访问界面中的视图,如果视图在布局文件中定义id属性,类似代码“android:id="@+id/textview"”,那么在程序代码中就可以通过R.id.textview表达式访问该视图。
3.2.3 MainActivity.java文件
Hello Android应用只有一个屏幕,所以只有一个活动类——MainActivity.java文件。MainActivity.java具体代码如下:
package com.a51work6.helloandroid; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
MainActivity是一个活动组件,MainActivity的父类是AppCompatActivity, AppCompatActivity是Activity子类,AppCompatActivity是支持ActionBar的活动类。onCreate方法是在活动组件初始化时候调用方法。setContentView方法是设置活动布局内容,参数是R.layout.activity_main。
3.2.4 activity_main.xml布局文件
布局文件activity_main.xml位于res的layout目录中,activity_main.xml布局文件代码如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.a51work6.helloandroid.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World! "/> </RelativeLayout>
RelativeLayout说明当前界面布局是相对布局,TextView声明一个标签视图,具体内容将在后面的章节详细介绍。界面布局文件activity_main.xml可以使用文本工具打开,Android Studio提供界面设计工具如图3-10所示,在界面设计工具中可以通过拖曳视图到设计窗口实现界面设计。
图3-10 Android Studio提供界面设计工具
提示 在界面设计窗口的左下角有两个标签——Design和Text,单击Text标签可以切换到Xml文本编辑窗口。
3.2.5 AndroidManifest.xml文件
Android的每个应用都必须包含一个AndroidManifest.xml清单文件,清单文件提供有关当前应用的基本信息,Android系统必须获得这些信息才能运行该应用。清单文件描述的内容如下:
❏ 声明应用的Java源代码包名,包名非常重要,它是应用的唯一标识符。
❏ 描述应用中的组件,即Activity(活动)、Service(服务)、Broadcast Receiver(广播接收器)和Content Provider(内容提供者)。
❏ 声明应用必须具备的权限,例如应用中使用到的服务权限(如GPS服务、互联网服务和短信服务等等)。
❏ 声明应用所需的最低Android API级别。
❏ 声明应用的安全控制和测试等信息。
注意 在Android Studio工程中,AndroidManifest.xml位于manifests根目录下;而在操作系统(如Windows的资源管理器)中,AndroidManifest.xml位于应用的根目录下,图3-9所示的app/src/main目录是应用的根目录。
AndroidManifest.xml文件代码如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.a51work6.helloandroid"> ① <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" ② android:label="@string/app_name" ③ android:supportsRtl="true" ④ android:theme="@style/AppTheme"> ⑤ <activity android:name=".MainActivity"> ⑥ <intent-filter> <action android:name="android.intent.action.MAIN"/> ⑦ <category android:name="android.intent.category.LAUNCHER"/> ⑧ </intent-filter> </activity> </application> </manifest>
代码第①行package="com.a51work6.helloandroid"是声明应用的Java源代码包名。清单文件中的组件声明是在标签application和 /application之间添加的。代码第②行android:icon="@mipmap/ic_launcher"是设置应用图标,@mipmap/ic_launcher是引用res/mipmap目录中的ic_launcher.png图片文件。代码第③行android:label="@string/app_name"是声明应用名,@string/app_name是引用res/values/strings.xml文件中的string name="app_name" /string标签中的内容。strings.xml代码如下:
<resources> <string name="app_name" Hello Android /string> </resources>
AndroidManifest.xml文件代码第④行android:supportsRtl="true"是声明应用支持从右往左书写语言习惯(主要是阿拉伯语和希伯来语)。代码第⑤行是声明应用主题为AppTheme。
代码第⑥行声明活动组件,在活动中可以声明Intent Filter(意图过滤器),组件通过意图过滤器实现响应Intent(意图), Android系统启动某个组件之前,需要了解该组件要处理哪些意图。清单文件中的组件声明是在标签intent-filter和 /intent-filter之间添加的,代码第⑦行和第⑧行是声明当前活动是主屏幕启动的活动,即应用启动的第一个界面。