手把手带你搭建开发环境-Android

俗话说得好,工欲善其事,必先利其器,开着记事本就想去开发Android程序显然不是明智之举,选择一个好的IDE可以极大幅度地提高你的开发效率,因此本节我就将手把手带着你开发环境搭建起来。

准备所需要的软件

我现在对你了解的还并不多,但我希望已经是一个颇有经验的Java 程序员,这样你理解本书的内容时将会轻而易举,因为Android程序都是使用Java语言编写的。如果你对Java只是略有了解,那阅读本书应该会有一点困难,不过一边阅读一边补充Java知识也是可以的。但如果对Java完全没有了解,那么建议你可以暂时将本书放下,先买本介绍Java基础知识的书学上两个星期,把Java的基本语法和特性都学会了,再来继续阅读本书。

好了,既然你已经阅读到这里,说明你已经掌握Java的基本用法了,那么开发Java程序时必备的JDK你一定已经安装好了。下面我们再来看一看开发Android程序除了JDK外,还需要那些工具。

1.Android SDK

Android SDK是谷歌提供的Android开发工具包,在开发Android程序时,我们需要通过引入该工具包,来使用Android相关的API。

2.Eclipse

相信所有的Java开发者都一定对这个工具非常地熟悉,它是Java开发神器,最好用的IDE工具之一。Eclipse是开源的,这使得有很多基于Eclipse制作的优秀IDE得以问世,如MyEclipse、Aptana等。但我觉得它最吸引人的地方并不在这儿,而是它超强的插件功能。Eclipse支持极多的插件工具,使得它不仅仅可以用来开发Java,还可以很轻松地支持几乎所有主流语言的开发,当然也非常适合Android开发。 

除了Eclipse外,同样适合开发Android程序的IDE还有IntelliJ IDEA、Android Studio等。其中Android Studio是谷歌官方近期推出的新IDE,由于是专门为开发Android程序定制的,在Android Studio是谷歌官方近期推出的新IDE,由于是专门为开发Android程序定制的,在Android领域大有取代Eclipse的势头。不过本书中还是决定暂时继续使用Eclipse,因为Android Studio才推出不久,恐怕还不够移定。另外你将来的同事大多数应该还是用的Eclipse,如果跟他们选择不同的IDE,在工作效率上可能要打点折扣了。

3.ADT

ADT全称Android Development Tools,是谷歌提供的一个Eclipse插件,用于在Eclipse中提供一个强大的、高度集成的Android开发环境。安装了ADT,你不仅可以联机调试,而且还能够模似各种手机事件、分析你的程序性能等等。由于是Eclipse的插件,你不需要进行下载,在Eclipse中在线安装就可以了。

1.2.2 搭建开发环境

你可以将上述的软件全部都准备好,然后一个个安装完成(我当年就是这么干的),不过这已经是老方法了。谷歌现在提供了一种简便方式,在Android官网可以下载到一个绑定好的SDK工具包,你所需要用到的Android SDK、Eclipse、ADT插件全都包含在里面了,这样可以省去很多费时的安装操作。下载地址是:http://developer.android.com/sdk/。

你下载下来的将是一个压缩包,解压该压缩包之后的目录结构如图所示。

其中SDK Manager就是我们ANdroid SDK 的管理器,双击打开它可以看到所有可下载的Android SDK版本。由于Android版本已经非常多了,全部都下载会很耗时,并且前面我也说过,我们开发的程序主要面向Android4.0以后的系统,因此这里我只勾选API14以上的SDK版本,如图1.3所示。当然如果你带宽和硬盘都十分充足,也可以全部勾选。

勾选完后点击下角的Install 42 packages,然后会进入到一个确认安装界面,如图所示。

选中右下角的Accept License,然后点击Install,就进入了一个漫长的等待过程。这个时候也是你最轻松的时候了,因为你没什么事情要干,只需要等待就好。现在你可以喝杯茶,休息一会,如果你勾选的SDK比较多的话,干脆先去睡个觉吧!

经过漫长的等待之后,SDK终于是下载完成了。所有下载好的内容都放在了sdk这个目录下,除了开发工具包外,里面还包含文档、源码、示例等等。具体的东西等你用到的时候我再做介绍,目前你不用太过关心sdk这个目录下的内容,里面的东西过多,现在容易让你头晕眼花。

好了,sdk这个目录就先不管它了,是进修来看下eclipse这个目录了。其实这个目录也没什么好说的,就是进入eclipse目录,双击eclipse.exe来启动Eclipse就完了。这个Eclipse是安装好ADT插件的Eclipse会多出一些东西来,比如你会在Eclipse的工具栏找到图1.5所示的几个图标。

这几个图标你应该是没有见过的,我来简单为你介绍下。最左边的图标其实你已经比较熟悉了,就是你睡觉前使用过的Android SDK管理器,点击它和点击SDK Manager效果是一样的。中间的图标是用来开启Android模似器的,如果你还没有Android手机的话,开发时就必须使用模似器了。最右边的图标是用来进行代码检查的,你暂时还用到它。

那我们现在就来启动一个模似器看看效果吧,点击中间的图标会弹出如图1.6所示的窗口。

然后点击右侧的New来创建一个新的模似器。这里我们准备创建一个Android4.0系统的模似器,因此模拟器名叫4.0好了,设备这里我选择了一个3.2英寸屏幕的手机,目标指定为Android4.0,然后再稍微分配一下手机内存和SD卡大小,就可以点击OK了,如图1.7所示。

创建完成后,我们选中刚刚创建的模似器,然后点击Start,在弹出窗口中点击Launch,就可以启动模拟器了。模拟器会像手机一样,有一个开机过程,启动完成之后的界面如图1.8所示。

很清新的Android界面出来了,看上去还挻不错吧,你几乎可以像使用手机一样使用它,Android模似器对手机的模仿度非常高,快去体验一下吧。

模似器的右侧是一块键盘区域,其中中间的四个按键非常重要,从左到右依次是Home键、Menu键、Back键和Seach键。Home键让你在任何时候都可以回到桌面,Menu键用于在程序界面中显示菜单,Back键用于返回到上一个界面,Search键让你可以更加轻松地使用谷歌搜索功能。

目前为止,Android开发环境就已经全部搭建完成了。那现在应该做什么?当然写下你的第一行Andoid代码了,让我们快点开始吧。

手机一部、全新Android模似器一个、九成新粗布Android战袍一套、微型信心增强大力丸一颗。穿戴好战袍,服下大力丸。继续前进。

创建你的第一个Android项目

任何一个编程语言写出的第一个程序毫无疑问都会是Hello World,这已经是20世纪70年代一直流传下来的传统,在编程界已成为永恒的经典,那我们当然也不会搞例外了。

1.3.1创建HelloWorld项目

在Eclipse的导航栏点击File-New-Android Application Project,此时会弹出创建Android项目的对话框其中Application Name代表应用名称,此应用安装到手机之后会在手机上显示该名称,这里我们填入Hello World。Project Name代表项目名称,在项目名称,在项目创建完成后该名称会显示在Eclipse中,这里我们填入HelloWorld(项目名通常不加空格)。接着Package Name代表项目的包名,Android系统就是通过包名来区分不同应用程序的,因此包名一定要有唯一性,这里我填入com.test.helloworld。

接下来是几个下拉选择框,Minimum Required SDK是指程序最低兼容的版本,这里我们选择Android4.0。Target SDK是指你在该目标版本上已经做过了充分的测试,系统不会再帮你在这个版本上做向前兼容的操作了,这里我们选择最高版本Android4.4。Complie With是指程序将使用哪个版本的SDK进行编译,这里我们同样选择Android4.0。最后一个Theme是指程序UI所使用的主题,我个人比较喜欢选择None。全部都选择好的界面如图1.9所示。

现在我们可以点击Next了,下一个界面是创建项目的一些配置,全部保持默认配置就好,如图1.10所示。

直接点击Next进入到启动图标的配置界面,在这里配置的图标就会是你的应用程序安装到手机之后显示的图标,如图1.11所示。

如果你程序的Logo还没设计好,别着急,在项目里面也是可以配置启动图标的,这里我们就先不配置,直接点击Next。

然后跳转到的是创建活动界面,在这个界面你可以选择一个你想创建活动类型,这里我们就选择Blank Activity了,如图1.12所示。

继续点击Next后,我们需要给刚刚选择的Blank Activity起一个名字,然后给这个活动布局也起一个名字。Activity Name就填入HelloWorldActivity,Layout Name就填入hello_world_layout吧,如图1.13所示。

然后点击Finish,项目终于创建完成了!

1.3.2运行HelloWorld

这个时候的Eclipse中应该会显示出刚刚创建的Hello World项目,由于ADT已经自动为我们生成了很多东西,你现在不需要写任何代码,HelloWorld项目就已经可以运行了。不过在运行之前,让我们先检查一下刚才的模拟器是不是还在线。

点击Eclipse导航栏中的Window-Open Perspective-DDMS,这时你会进入到DDMS的视图中去。DDMS中提供了很多我们开发Android程序时需要用到的工具,不过目前你只需要关注Devices窗口中有没有Online的设备就行了。如果你的Devices窗口中有一个设备显示是Online的,那就说明目前一切正常,你的模似器是在线的。如果Devices窗口中没有设备,可能是你已经把模似器关掉了,没关系,按照前面的步骤重新打开一次就行了。如果你的Devices窗口中虽然有,但是显示Offline,说明你的模似器掉线了,这种情况概率不高,但是如果出现了,你只需要点击Reset adb就好了,如图1.14所示。

好了,确认完模似器在线后,点击Eclipse工具栏右侧的Java选项,回到之前的视图,然后我们来运行一下项目吧。右击HelloWorld项目-Run As-Android Application。等待大约几秒钟的时间,你的项目就会运行起来了。现在快去看看你的模拟器吧,结果应该和图1.15中显示的是一样的。

这个时候你可能会说我坑你了,说好的第一行代码呢?怎么一行学没写,项目就已经运行起来了?这个只能说因为ADT太智能了,已经帮我们把一些简单内容都自动生成了。你也别心急,后面写代码机会多着呢,我们先来分析一下HelloWorld这个项目吧。

分析你的第一个Android程序

还是回到Eclipse中,首先展开HelloWorld项目,你会看到如图1.17所示的目录结构。

---开始看到这么多陌生的东西,你一定会感到有点头晕吧。别担心,我现在就对上图中的内容一一调解,你很快再看这张图就不会感到那么吃力了。

1.src

毫无疑问,src目录是放置我们所有Java代码的地方,它在这里的含义和普通Java项目下的src目录是完全一样的,展开之后你将看到我们刚才创建的HelloWorldActivity文件就在里面。

2.gen

这个目录里的内容都是自动生成的,主要有一个R.java文件,你在项目中添加的任何资源都会在其中生成一个相应的资源id。这个文件永远不要手动去修改它。

3.assets

这个目录用得不多,主要可以存放一些随程序打包的文件,在你的程序运行时可以动态读取到这些文件的内容。另外,如果你的程序中使用到了WebView加载本地网页的功能 ,所有网页相关的文件也都存放在这个目录下。

4.bin

这个目录你也不需要过多关注,它主要包含了一些编译时自动产生的文件。其中会有一个你当前项目编译好的安装包,展开bin目录你会看到HelloWorld.apk,把这个文件拷到手机上就可以直接安装了。

5.libs

如果你的项目中使用到了第三方的Jar包,就需要把这些Jar包都放在libs目录下,放在这个目录下的Jar包都会被自动添加到构建路径里去。你可以展开上图中Android4.0、Android Privatc Libraries、 Android ependencies这些库,其中显示的Jar包都是已经被添加到构建路径里的。

6.res

这个目录下的内容就有点多了,简单点说,就是你在项目使用到的所有图片、布局、字符串等资源都要存放在这个目录下,前面提到的R.java中的内容也是根据这个目录下的文件自动生成的。当然这个目录下还有很多的子目录,图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下,所以你不用担心会把整个res目录弄得乱糟糟的。

7.AndroidManifest.xml

这是你整个Android项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件里注册。另外还可以在这个文件中给应用程序添加权限声明,也可以重新指定你创建项目时指定的程序最低兼容版本和目标版本。由于这个文件以后会经常用到,我们用到的时候再做详细说明。

8.project.properties

这个文件非常地简单,就是通过一行代码指定了编译程序时所使用的SDK版本。

我们的HelloWorld项目使用的是API14,你也可以在这里改成其他版本试一试。

这样整个项目的目录结构就都介绍完了,如果你还不能完全理解的话也很正常,毕竟里面有太多的东西你都没接触过。不用担心,这并不会影响到你后面的学习。相反,等你学完整本书后再回来看这个目录结构图时,你会觉得特别地清晰和简单。

接下来我们一起分析一下HelloWorld项目究竟是怎么运行起来的吧。首先打开AndroidManifest.xml文件,从中可以找到如下代码:

<activity

android:name="com.test.helloworld.HelloworldActivity"

android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

这段代码表示对HelloWorldActivity这个活动进行注册,没有在AndroidManifest.xml时注册的活动是不能使用的。其中intent-lilter时的两行代码非常重要,<action android:name="android.intent.action.MAIN" />和<category android:name="android.intent.category.LAUNCHER" />表示Hello worldActivity是这个项目的主活动,在手机上点击应用图标,首先启动的就是这个活动。

那HelloWorldActivity具体又有什么作用呢?我在介绍Android四大组件的时候说过,

活动是Android应用程序的门面,凡是在应用中你看得到的东西,都是放在活动中的。因此你在图1.15中看到的界面,其实就是HelloSorldActivity这个活动。那我们快去看一下它的代码吧。打开HelloWjorldActivity,代码如下所示:

public class HelloWorldActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(aavedInstanceState);

setCjontentView(R.layout.hello_world_layout);

}

@Override

public boolean onCreateOptionsMenu(menu){

//Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.hello_world, menu);

return true;

}

}

首先我们可以看到,HelloWorldActivity是继承自Activity的。Activity是Android系统提供的一个活动基类,我们项目中所有的活动都必须要继承它才能拥有活动的特性。然后可以看到HelloWorldActivity中有两个方法,onCreateOptionsMenu()这个方法是用于创建菜单的,我们可以先无视它,主要看下onCreate()方法。onCreate()方法是一个活动被创建时必定要执行的方法,其中只有两行代码,并且没有Hello world!的字样。那么图1.15中显示的Hello world!是在哪里定义的呢?

其实Android程序的设计讲究逻辑和视图分享,因此是不推荐在活动中直接编写界面的,更加通用的一种做法是,在布局文件中编写界面,然后在活动中引入进来。你可以看到,在onCrcate()方法的第二行调用了setContentView()方法,就是这个方法给当前的活动引入了一个hello_world_layout布局,那Hello world!一定就是在这里定义的了!我们快打开这个文件看一看。

布局文件都是定义在res/layout目录下的,当你展开layout目录,你会看到hello_world_layout.xml这个文件。打开之后代码如下所示:

<RelativeLayout xmln:android="http://schemas.android.com/apk/res/android

xmlns:tools="http://achemas.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=".HelloWorldActivity">

<TextView

anndroid:layout_width="wrap_content"

anndroid:layout_height="wrap_content"

anndroid:text="@string/hello_world"/>

</RelativeLayout>

这段代码表示对HelloWorldActivity这个活动进行注册,没有在Android anifest.xml里注册的活动是不能使用的。其中intent-filter里的两行代码非常重要。<action android:name="android.intent.action.MAIN"/>和<categoury android:name="android.intent.category.LAUNCHER"/&t;表示HelloWorldActivity是这个项目的主活动,在手机上点击应用图标,首先启动的就是这个活动。

那HelloWorldActivity具体又有什么作用呢?我在介绍Android四大组件的时候说过,活动是Android应用程序的门面,凡是在应用中你看得到的东西,都是放在活动中的。因此你在图1.15中看到的界面,其实就是HelloWorldActivity这个活动。那我们快去看一下它的代码吧,打开HelloWorldActivity,代码如下所示:

public class HelloWorldActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.hello_world_layout);

}

@Override

public boolean onCreateOptionsMenu(Menu menu){

//Inflate the menu; this adds items to the action bar if it is present.

qetMenuInflater().inflate(R.menu.hello_world,menu);

teturn true;

}

}

首先我们可以看到,HelloWorldActivity是继承自Activity的。Activity是Android系统提供的一个活动基类,我们项目中所有的活动都必须要继承它才能拥有活动的特性。然后可以看到HelloWorldActivity中有两个方法,onCreateOptionsMenu()这个方法是用于创建菜单的,我们可以先无视它,主要看下onCreate()方法。onCreate()方法是一个活动被创建时必定要执行的方法,其中只有两行代码,并且没有Hello world!的字样。那么图1.15中显示的Hello world!是在哪里定义的呢?

其实Android程序的设计讲究逻辑和视图分离,因此是不推荐在活动中直接编写界面的,更加通用的一种做法是,在布局文件中编写界面,然后在活动中引入进来。你可以看到,在onCreate()方法的第二行调用了setContentView()方法,就是这个方法给当前的活动引入了一个hello_world_layout布局,那Hello world!一定就是在这里定义的了!我们快打开这个文件看一看。

布局文件都是定义在res/layout目录下的,当你展开layout目录,你会看到hello_world_layout.xml这个文件。打开之后代码如下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://achemas.android.com/tools"

android:layout_width=mathc_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=".HelloWorldActivity">

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text+"@string/hello_world" />

</RelativeLayout>

现在还看不懂?没关系,后面我会对布局进行详细讲解的,你现在只需要看到上面代码中有一个TextView,这是Android系统提供的一个控件,用于在布局中显示文字的。然后你终于在TextView中看到了hello world的字样,哈哈终于找到了,原来就是通过android:text="@string/hello_world"这句代码定义的!咦?感觉不对劲啊,好像图1.15中显示的是Hello world!,这感叹号怎么没了,大小写也不太一样。

其实你还是被欺骗了,真正的Hello World!字符串也不是在布局文件中定义的Android不推荐在程序中对字符串进行硬编码,更好的做法一般是把字符串定义在res/values/strings.xml里,然后可以在布局文件或代码中引用。那我们现在打strings.xml看一下,里面的内容如下:

<resources>

<string name="app_name">Hello World</string>

<string name="action_settings">Settings</string>

<string name="hello_sorld">Hello world!</atring>

</resources>

这下没有什么再能逃出你的法眼了,Hello world字符串就是字义在这个文件里的。并且字符串的字义都是使用键值对的形式,Hello world!</string>

</resources>

这下没有什么再能逃出你的法眼了,Hello world!字符串就是定义在这个文件里的。并且字符串的定义都是使用键值对的形式,Hello_world这个键。你猜对了,我们还可以在这里通过修改app_name对应的值,来改变此应用程序的名称。那到底是哪里引用了app_name这个键呢?打开AndroidManifest.xml文件自己找找去吧!