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之间添加的,代码第⑦行和第⑧行是声明当前活动是主屏幕启动的活动,即应用启动的第一个界面。