准备好Android Studio开发环境,就可以准备开发第一个Android应用程式专案。一个Android应用程式,除了需要的Java原始程式码,还必须包含一些Android应用程式需要的档案,这些档案都要依照规定放在规定的目录,例如每一个Android应用程式模组,一定要有一个名称为“AndroidManifest.xml”的应用程式设定档,它是一个XML格式的档案。所以开发Android应用程式,除了使用Java程式设计语言撰写一些需要的程式码,也要开始学习Android应用程式专案的结构和各种需要的档案。
这一章会说明如何建立一个Android应用程式专案,了解基本的应用程式专案结构。如何在模拟装置与实际装置上执行与测试应用程式。还有认识Android应用程式基本元件与应用程式的种类。
## 3-1 应用程式专案介绍
目前Android建议的应用程式开发工具为Android Studio,它整合所有开发Android 应用程式需要的工具,包含建立需要的模拟装置,撰写需要的程式与档案,编译、包装、执行与测试应用程式,所有的工作都可以在Android Studio中完成。
### 3-1-1 建立应用程式专案
不管学习哪一种程式技术,第一个应用程式通常是在画面上显示一个简单的问候讯息,例如“Hello world!”。接下来会说明如何建立一个Android应用程式专案,在模拟装置执行以后,画面上显示简单的问候讯息。虽然第一个Android应用程式专案非常简单,不过这里说明建立与执行专案的操作,都是开发Android应用程式基本的操作。
依照下列步骤建立一个Android应用程式,并且在Android模拟装置中执行与测试:
1. 启动Android Studio,选择“Start a new Android Studio project”:
[![AndroidTutorial5_01_03_01](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_01-300x243.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_01.png)
2. 依照下列的说明输入应用程式基本资讯,后面会详细的说明。输入完后选择“Next”:
* Application Name:HelloAndroid。
* Company Domain:macdidi.net。
* Package Location:应用程式储存的位置,使用原来的默认值。
[![AndroidTutorial5_01_03_02](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_02-300x180.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_02.png)
3. 选择应用程式模组的种类与版本,勾选“Phone and Tablet”,在选择“Minimum SDK”之前,先选择“Help me choose”:
[![AndroidTutorial5_01_03_03](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_03-300x180.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_03.png)
4. 显示目前Android各版本实体装置的百分比,如果应用程式的最低版本选择4.0版,API Level为15,有78.3%的实体装置可以执行这个应用程式。选择4.0版的项目查询详细的资讯:
[![AndroidTutorial5_01_03_04](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_04-300x204.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_04.png)
5. 选择4.0版的项目以后,画面右侧显示这个版本支援的项目,选择“OK”:
[![AndroidTutorial5_01_03_05](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_05-300x204.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_05.png)
6. 回到选择应用程式种类与版本的画面,采用“Minimum SDK”默认的选项“Android 4.0.3”,选择“Next”:
[![AndroidTutorial5_01_03_06](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_06-300x180.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_06.png)
7. 选择“Blank Activity”,为应用程式加入一个基本的Activity元件,提供这个应用程式一个画面,选择“Next”:
[![AndroidTutorial5_01_03_07](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_07-300x180.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_07.png)
8. 设定Activity元件的基本资讯,全部采用默认的名称与设定,选择“Finish”完成建立应用程式的设定:
[![AndroidTutorial5_01_03_08](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_08-300x180.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_08.png)
9. Android Studio启动新的应用程式视窗,第一次启动的时候会显示一个提示的视窗。取消“Show Tips on Startup”选项,下次就不会再出现。选择“Close”:
[![AndroidTutorial5_01_03_09](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_09-300x189.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_09.png)
10. 第一次启动Android Studio应用程式视窗的时候,会执行一些初始化的工作,请耐心等候。这是完成初始化工作以后的画面。:
[![AndroidTutorial5_01_03_10](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_10-300x214.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_10.png)
11. 选择Android Studio功能表“Run -> Run 'app'”,准备在Android模拟装置中执行与测试。安装好Android Studio以后,已经建立好一个默认的Android模拟装置。在选择装置的对话框,勾选“Lanuch emulator”表示要启动Android模拟装置,Android virtual device目前只有一个选项,最后选择“OK”:
[![AndroidTutorial5_01_03_11](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_11-300x271.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_11.png)
12. Android Studio启动Android模拟装置,并且在模拟装置安装与启动应用程式,这些工作需要花费一些时间,请耐心等候。
13. Android模拟装置启动完成后,画面为锁定的状态,使用鼠标在画面下方按住左键,往上拖拉以后放开就可以解锁:
[![AndroidTutorial5_01_03_12](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_12-168x300.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_12.png)
14. 解锁以后就会出应用程式执行后的画面:
[![AndroidTutorial5_01_03_13](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_13-168x300.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_13.png)
在建立应用程式过程中输入的资讯,有一些设定必须先认识,否则建立专案以后再执行修改的工作,会比较麻烦一些,而且容易出现错误。在第一个视窗的应用程式专案基本资讯部份:
* Application Name:为这个应用程式取一个名称,应用程式安装在装置以后,这个名称会出现在应用程式列表的图示下方,所以名称应该要尽量简短一些。
* Company Domain:输入公司或个人的网域名称,用来决定应用程式的主要套件名称,采用Java应用程式的套件规则。Android规定应用程式一定需要套件,不可以把程式码放在默认套件,而且最少要有两层。这个套件名称非常重要,因为Android应用程式是采用套件名称来识别的,所以在Google Play上的Android应用程式,不允许有同样的套件名称。Android Studio会把你输入的网域名称前后颠倒,当作前面的套件名称,后面再加上应用程式的名称。例如网域名称是macdidi.net,应用程式名称是HelloAndroid,套件的名称就是“net.macdidi.helloandroid”。
* Package Location:决定应用程式储存的位置,使用原来的默认值。
### 3-1-2 Android应用程式架构
一个Android应用程式专案除了必要的Java原始程式码,还有各种应用程式需要的档案,所以应用程式专案的目录会比较多一些。在Android Studio建立一个应用程式专案以后,会建立一些默认的目录与档案,你需要先认识一些基本的目录。下列是在“app”Android应用程式模组目录下的内容:
* mainifests:应用程式模组的主要设定档“AndroidManifest.xml”在这个目录下。
* java:应用程式模组需要的Java原始程式码都放在这个目录下,展开它以后会看到一个套件,这是在建立专案时决定的主要套件名称。目前这个套件下有一个默认元件类别MainActivity.java。
* res:Android应用程式很重要的资源目录,应用程式需要的资源,例如图形(png)与音效(mp3)档案,还有各种XML格式的资源档案都放在这个目录。例如在“res/layout”目录下,已经建立一个名称为“activity_main.xml”的默认画面配置档案。
另外还有一个“Gradle Scripts”目录,储存与Gradle建置系统相关的设定档,Gradle是Android Studio采用的全新应用程式建置系统。在Android Studio开发Android应用程式,一个应用程式可以有多个模组(Module)。例如一个音乐播放应用程式,可以包含移动电话、平板电脑、穿戴式三个模组,每一个模组都可以被建置成一个独立的App。在Gradle Scripts目录有下列两个主要的设定档,它们都是Groovy格式的文字档:
* build.gradle(Project:专案名称):应用程式最顶端的Gradle设定档。以前面建立的应用程式专案来说,名称是“build.gradle(Project:HelloAndroid)”。
* build.gradle(Module:模组名称):每一个模组的Gradle设定档。以前面建立的应用程式专案来说,名称是“build.gradle(Module:app)”。
## 3-2 应用程式模组Gradle设定档
每一个Android应用程式模组都有一个Gradle建置设定档案,以前面建立的应用程式专案来说,这个设定档是在“Gradle Scripts”目录下的“build.gradle(Module:app)”。下列是这个档案的基本格式:
~~~
apply plugin: 'com.android.application'
android {
compileSdkVersion 应用程式模组编译的版本(Android API Level)
buildToolsVersion "Android建置工具的版本编号"
defaultConfig {
applicationId "应用程式模组的主套件名称"
minSdkVersion 最低版本(Android API Level)
targetSdkVersion 主要版本(Android API Level)
versionCode 自定的应用程式模组版本编号
versionName "自定的应用程式模组版本名称"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard- rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
}
~~~
在建立应用程式专案的时候,Android Studio会依照你的设定,建立一个像这样的档案:
~~~
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "net.macdidi.helloandroid"
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
}
~~~
目前Android 2.3.x(API Level 10)的实体装置还有7.4的比例,如果想要让应用程式也可以在这一个版本运作,在2.3.x都支援应用程式使用的APIs的情况下,就可以把“defaultConfig”区块中的“minSdkVersion”设定改为“10”。修改这个设定档以后,Android Studio会提醒你执行专案同步的工作,选择画面上的“Sync Now”:
[![AndroidTutorial5_01_03_14](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_14-300x174.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_14.png)
在“defaultConfig”区块中的“versionCode”与“versionName”,可以设定应用程式的版本资讯:
* versionCode="数字":自己编制的版本流水号,例如1,2,3…。
* versionName="版本名称":自己命名的版本名称,例如1.1或2.0。
在“android”区块中的“buildToolsVersion”设定,可以用来决定建置工具的版本。因为Andoird建置工具会经常更新,最新的版本可以在Android SDK Manager中查询:
[![AndroidTutorial5_01_03_15](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_15-300x214.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_15.png)
## 3-3 应用程式模组设定档
每一个Android应用程式模组还有一个主要的设定档案,档案的名称是“AndroidManifest.xml”,位置在应用程式模组的“mainifests”目录下。它是一个XML格式的档案,档案里面都是一些应用程式非常重要的设定。设定档的内容使用XML格式的写法,你会使用一些Android提供的标签执行需要的设定。
Android应用程式中会包含许多XML格式的档案,不同用途的档案,都会使用一些“标签”来执行一些设定,以应用程式设定档来说,它的基本内容会像这样:
~~~
<?xml version="1.0" encoding="utf-8"?>
<!-- 上面这行表示这是一个XML文件,一定要在第一行 -->
<!-- 最外层一定是一个manifest的标签 -->
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="net.macdidi.helloandroid" >
<!-- 在里面使用不同的标签执行一些设定 -->
...
<!-- manifest的结束标签,表示它的范围 -->
</manifest>
~~~
因为在设计Android应用程式的时候,会使用很多XML格式的档案,所以你必须先了解XML基本的语法。XML是一个纯文字格式的档案,不同技术的XML档案,会有自己设定的各种标签名称。使用标签有几种固定的写法,其中一种是包含开始和结束的标签,在标签名称的后面,通常会有一些设定这个标签的资讯,设定值一定要放在双引号之间:
~~~
<标签名称 设定名称="设定值" ... >
...
</标签名称>
~~~
在执行不同设定的时候也有另外一种写法,在标签名称后面同样可以有一些设定资讯,不过它没有结束的标签,在结尾部份一定要使用“/>”:
~~~
<标签名称 设定名称="设定值" ... />
~~~
在XML文件中的标签名称和设定名称都是分大小写的,在一个标签里面执行一些设定的时候,它们的前后顺序并没有特别规定。例如一个像这样的标签设定:
~~~
<Button android:color="#000"
android:text="Hello!" />
~~~
跟这样的标签写法效果是一样的:
~~~
<Button android:text="Hello! "
android:color="#000" />
~~~
### 3-3-1 设定应用程式基本资讯
使用Android Studio建立Android应用程式以后,会为你建立好应用程式设定档案,里面已经包含在建立专案过程输入的一些专案基本资讯,例如应用程式模组的名称。如果在建立专案的时候输入错误的资讯,也可以开启这个档案后直接修改它:
~~~
<?xml version="1.0" encoding="utf-8"?>
<!-- 最外层一定是一个manifest的标签 -->
<!-- xmlns:android="...", 这个设定一定要有,而且固定不变 -->
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
... >
...
</manifest>
~~~
在mainfest标签中有这些应用程式的基本设定:
* package="应用程式模组的主套件名称":在建立应用程式的时候输入的主套件名称,尽可能不要修改它,如果真的要修改的话,在原始程式码src目录下的套件也要一起修改;存盘后,ADT会自动帮你修改gen目录下的套件名称。
* android:installLocation="安装位置":设定应用程式安装的位置,可以设定为“auto”、“internalOnly”或“preferExternal”,依序为由系统自动决定、只安装在内建储存位置和以外部储存设备(记忆卡)为优先。
### 3-3-2 设定应用程式模组的设备资讯
在应用程式设定档的“mainfest”开始和结束标签里面,也可以使用这些标签加入常用的设定:
~~~
<?xml version="1.0" encoding="utf-8"?>
<manifest .. >
<!-- 设定应用程式需要的操作设备 -->
<uses-configuration ... />
<!-- 设定应用程式需要的萤幕设备 -->
<supports-screens ... />
</manifest>
~~~
如果应用程式需要一些特定的硬件设备才可以正确的运作,例如触控萤幕或实体键盘,可以使用放在mainfest标签里面的“uses-configuration”标签执行相关的设定。它可以使用下列这些设定:
* android:reqFiveWayNav="true|false":是否需要上下左右方向的控制设备。
* android:reqHardKeyboard="true|false":是否需要实体键盘。
* android:reqKeyboardType="设定":设定实体键盘种类,可以设定为undefined、nokeys、qwerty或twelvekey。
* android:reqNavigation="设定":是否需要浏览资料用的控制设备,可以设定为undefined、nonav、dpad、trackball或wheel。
* android:reqTouchScreen="设定":设定触控萤幕设备种类,可以设定为undefined、notouch、stylus或finger,目前的实体装置大部份都是finger这种触控萤幕设备。
Android装置有一个特点,就是各种装置的萤幕尺寸有很大的差异,如果应用程式需要在特定的萤幕尺寸才可以正确的运作,可以使用放在mainfest标签里面的“supports-screens”标签执行相关的设定。它可以使用这些设定:
* android:smallScreens="true|false":是否支援比HVGA小的萤幕。
* android:normalScreens="true|false":是否支援HVGA、WVGA和WQVGA萤幕。
* android:largeScreens="true|false":是否支援比HVGA、WVGA和WQVGA大的萤幕。
* android:xlargeScreens="true|false":是否支援像平板电脑的大型萤幕。
* android:requiresSmallestWidthDp="设定":设定最低萤幕宽度,设定值为画素,例如“480”。
* android:compatibleWidthLimitDp="设定":设定相容的最大萤幕宽度,设定值为画素,例如“800”。
* android:largeWidthLimitDp="设定":设定最大萤幕宽度,设定值为画素,例如“1024”。
### 3-3-3 设定应用程式元件资讯
Android应用程式设定档里面,一定要加入需要的应用程式设定,在manifest标签里面,一定有一个“application”标签,在这个标签中执行应用程式元件的重要设定:
~~~
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application ... >
<!-- 应用程式包含的Activity元件 -->
<activity
android:name="包含套件名称的元件类别名称" >
...
</activity>
<!-- 应用程式包含的服务元件 -->
<service
android:name="包含套件名称的元件类别名称" >
...
</service>
<!-- 应用程式包含的广播接收元件 -->
<receiver
android:name="包含套件名称的元件类别名称" >
...
</receiver>
<!-- 应用程式需要的额外资讯 -->
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="..." />
</application>
</manifest>
~~~
Android提供许多不同应用程式的元件,让你可以建立需要的应用程式,Android元件必须依照规则实作一个Java类别,写好元件类别以后,一定要在应用程式设定档的application标签中加入对应的设定:
* Activity:设定Activity元件的相关资讯。
* Service:设定服务元件的相关资讯。
* Receiver:设定广播接收与小工具元件的相关资讯。
这些标签中有一个一定要加入的设定是“android:name”,使用它设定元件类别的名称,这样Android才可以正确使用这些应用程式元件。
## 3-4 Android应用程式介绍
就像个人电脑的应用程式一样,Android应用程式也有几种不同的类型,Android作业系统可以让你依照应用程式的需求,开发许多不同种类的应用程式元件,这些元件可以组合成一个具有操作功能画面和其它各种用途的应用程式。以应用程式的功能来说,Android应用程式可以分为这些种类:
* 一般应用程式:和个人电脑中的计算机或文书处理类似,Android可以建立各种提供操作功能与浏览资料画面的“Activity”元件,依照应用程式的需求,可能会有多个“Activity”元件。
* 背景服务应用程式:在个人电脑中,通常会有一些在背景中运作的应用程式,例如预防病毒的软件,你不需要去操作它,它会在作业系统的背景中帮我们检查网络或档案是否有病毒的问题。Android可以建立在背景中运作的“Service”和“BroadcastReceiver”元件,这种元件会在Android作业系统的背景中运作,在遇到指定的情况时,它就会执行你指定的工作,例如需要在使用者开启互联网时执行资料更新的工作,就需要用到这类元件。
* 小工具:Android提供一种很特别的桌面元件,它可以让使用者安装在桌面指定的位置,执行功能操作或浏览资料,这种元件称为“AppWidget”。
这些只是依照元件的分类来介绍Android应用程式,功能比较单纯一点的应用程式,例如计算机,它只需要设计Activity元件提供画面就可以了;如果应用程式的功能比较复杂,就可能同时需要Activity、Service、BroadcastReceiver和AppWidget四种主要的元件,才能完成应用程式需要的功能。
### 3-4-1 一般应用程式
如果一个Android应用程式,只有包含一些画面让使用者执行操作或浏览资料,就可以把它称为一般应用程式。在一般Android应用程式中,一个画面就是一个继承自“android.app.Activity”的Java类别,通常会把它称为Activity元件,如果应用程式的功能比较复杂一些,需要的画面,也就是Activity元件就会多一些:
[![AndroidTutorial5_01_03_16](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_16-180x300.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_16.png) [![AndroidTutorial5_01_03_17](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_17-180x300.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_17.png)
[![AndroidTutorial5_01_03_18](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_18-180x300.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_18.png) [![AndroidTutorial5_01_03_19](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_19-180x300.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_19.png)
在建立Android应用程式专案的时候,ADT会帮你建立好一个默认的Activity元件,如果你没有特别修改名称的话,它的类别名称会是“MainActivity”,而且它会放在这个专案设定的主套件下。一般的应用程式设计通常会把应用程式需要的Activity元件类别放在主套件下。开启这个Activity元件类别后会像这样:
~~~
package net.macdidi.helloandroid;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
// 继承自Activity类别
public class MainActivity extends Activity {
// 覆写Activity类别的onCreate方法
@Override
protected void onCreate(Bundle savedInstanceState) {
// 一定要加入呼叫父类别onCreate方法的叙述
super.onCreate(savedInstanceState);
// 指定这个元件使用的画面配置资源
setContentView(R.layout.activity_main);
}
// 设定选单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
...
}
}
~~~
Android采用目前Java应用程式常见的框架(Framework)开发方式,这表示你在设计一些Android元件类别的时候,都会让你继承一个指定的类别,在撰写元件类别的时候,也要依照这个元件的规则,覆写一些需要的方法。以Activity元件类别来说,目前只需要执行画面设计与指定的工作,Activity元件类别规定你覆写“onCreate”方法以后,在方法中执行Activity元件的准备工作。Android在启动这个Activity元件的时候,会呼叫“onCreate”方法一次,执行你写在这个方法中的程式码。执行覆写工作的时候,大部份的情况下,都必须呼叫父类别被覆写的方法,然后再执行其它需要的工作。
Android应用程式跟一般Java应用程式的设计方式有很大的差异,尤其是在应用程式的资源部份。虽然Activity元件是提供一个应用程式中的画面,不过在上面的元件类别中你看不到跟画面相关的程式码,只有一行指定画面配置资源的叙述,它呼叫父类别的“setContentView”方法,在参数中指定一个以“R.layout”开始的资源变量,这是Android用来代表画面配置资源的格式,后面的名称是画面资源名称,你可以使用这个名称到“专案目录\res\layout”目录下找到这个附加档名为“.xml”的档案。开启它后会是这样的内容:
~~~
<!-- 决定画面的配置 -->
<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=".MainActivity" >
<!-- 目前画面只有一个文字符件 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
~~~
Android希望设计应用程式的画面时,不是在Activity元件类别的程式码中,使用撰写程式码的方式来设计需要的画面,而是应该使用XML格式的画面配置档设计画面,在这个画面配置档案中加入画面需要的元件,在Activity元件类别把这个档案引用进来当作它的画面就可以了。
如果你执行过这个应用程式,出现的画面应该是简单的在画面中显示“Hello world!”的讯息,可是你在画面配置档案中也看不到这个讯息内容。这又是Android一个比较不一样的设计方式,在应用程式中常需要显示各种文字,例如显示在功能按钮上的文字,Android也不希望你直接设定在画面配置档中。所以在上面的文字符件(TextView)中,有一个“android:text”的设定,里面指定的是“@string/”开始的内容,这是Android另外一种文字资源,后面是它的资源名称“hello_world”。你可以开启“专案目录\res\values\strings.xml”档案,它的内容会像这样:
~~~
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">HelloAndroid</string>
<string name="action_settings">Settings</string>
<!-- 在画面配置档中使用的文字资源 -->
<string name="hello_world">Hello world!</string>
</resources>
~~~
### 3-4-2 背景服务应用程式
一般应用程式在使用者启动以后,可以在画面上执行功能操作与浏览资料,不过结束应用程式以后,它们就不会运作了。在行动装置中,有一些应用是不需要画面,可是需要在背景中持续的运作,为我们执行一些指定的工作。例如Android作业系统内建一个检查应用程式是否需要更新的程式,如果发现需要更新应用程式,它就会通知使用者更新应用程式的讯息。类似这样的应用会使用服务(Service)元件来完成应用程式的需求。在Android装置里面,通常会有一些内建的系统服务,或是一些应用程式启动的服务在背景运作。执行“设定”应用程式,在应用程式项目的“执行中”可以看到有哪一些服务正在运作:
[![AndroidTutorial5_01_03_20](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_20-180x300.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_20.png) [![AndroidTutorial5_01_03_21](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_21-180x300.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_21.png)
Android服务元件是一个继承自“android.app.Service”的Java类别,完成需要的元件类别与设定以后,你可以启动或停止一个服务,启动的服务会在背景中执行你指定的工作,直到停止服务或重新开机。
行动装置应用程式也经常需要处理“事件导向”的工作,例如电池电量过低或收到短信这类事件发生的时候,如果需要执行一些特定的工作,你可以使用Android另外一种可以在背景中运作的广播接收元件,它是一个继承自“android.content.BroadcastReceiver”类别的Java类别,完成元件类别的撰写和执行需要的设定,这个应用程式被安装在装置以后,并不像一般应用程式有一个图示可以启动它,当装置发生元件指定的事件时,Android就会启动你的广播接收元件并执行你指定的工作。
### 3-4-3 小工具
Android作业系统在一般的装置中,提供五个桌面让使用者可以自己放一些应用程式的图示,点选它们就可以开启应用程式,这也是其它作业系统都会有的功能。Android也提供一种很特别的小工具(AppWidget)元件,使用者把它安装到桌面上指定的位置,部份的小工具还可以让使用者调整大小。使用小工具来执行一些像是开启与关闭无线网络或蓝芽的设定,或是使用其它各种应用的小工具,使用者不用进入应用程式,就可以执行一些功能操作或浏览资料。Android内建许多好用的小工具,你也可以开发各种不同应用的小工具:
[![AndroidTutorial5_01_03_22](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_22-180x300.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_22.png) [![AndroidTutorial5_01_03_23](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_23-180x300.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_23.png) [![AndroidTutorial5_01_03_24](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_24-180x300.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_24.png)
小工具元件是一个继承自“android.appwidget.AppWidgetProvider”的Java类别,它的设计方式会跟一般应用程式中的Activity元件很不一样,不过你也需要为它建立一个元件类别,依照小工具元件的规则撰写程式,设计画面配置档和建立所有需要的资源。
从Android 3.0开始,使用者安装小工具元件的操作方式,改为从应用程式的列表进入后,选择上方的小工具标签,找到需要安装的小工具,长按小工具元件后再放到桌面上。从Android 3.1开始,如果小工具允许修改大小的话,使用者长按安装在桌面上的小工具,等到调整大小的框线出现以后,就可以把小工具调整为需要的大小了。
[![AndroidTutorial5_01_03_25](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_25-180x300.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_25.png) [![AndroidTutorial5_01_03_26](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_26-180x300.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_26.png)
## 3-5 在Android Studio撰写Java程式码
Android应用程式元件需要搭配Java原始程式与其它各种档案,撰写Java程式码是开发Android应用程式很主要的工作。Java程式采用套件的结构,使用各种Java与Android的类别库,都需要在程式码正确的使用“import”叙述,应用程式才不会出现错误。
经过安装与设定好的Android Studio,在输入程式码的时候,有许多方便的功能。在Android Studio应用程式视窗,开启“app -> java -> net.macdidi.helloandroid”目录下的“MainActivity”,它是一个Activity元件的Java原始程式码。在这个程式码的“onCreate”方法最后面,输入一个在“java.util”套件中很常使用的“Date”类别:
[![AndroidTutorial5_01_03_27](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_27-300x205.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_27.png)
输入Date以后,Android Studio会自动列出可以选择的项目,你可以注意到在java.util和java.sql都有Date类别,选择java.util套件的Date类别以后,就会自动为你加入import叙述。
在撰写Java程式码的时候,也经常从别的地方复制后贴到Android Studio,例如下列这个程式片段:
~~~
List names = new ArrayList<>();
names.add("Simon");
names.add("Mary");
names.add("John");
~~~
把上面的程式码复制后贴到Android Studio,也会自动为你加入import叙述。如果贴上的程式码,出现可以选择的情况,例如下列这个程式片段:
~~~
String name = "Simon";
Date birthdate = new Date();
BigInteger balance = new BigInteger("100");
~~~
Android Studio会显示有多个Date可以选择的讯息:
[![AndroidTutorial5_01_03_28](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_28-300x113.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_28.png)
在上面的画面按“Alt + Enter”,选择正确的套件名称后,就可以加入正确的import叙述:
[![AndroidTutorial5_01_03_29](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_29-300x109.png)](http://www.codedata.com.tw/wp-content/uploads/2015/02/AndroidTutorial5_01_03_29.png)
- 第一堂
- 第一堂(1)西游记里的那只猴子
- 第一堂(2)准备 Android Studio 开发环境
- 第一堂(3)开始设计 Android 应用程式
- 第一堂(4)开发 Android 应用程式的准备工作
- 第二堂
- 第二堂(1)规划与建立应用程式需要的资源
- 第二堂(2)设计应用程式使用者界面
- 第二堂(3)应用程式与使用者的互动
- 第二堂(4)建立与使用 Activity 元件
- 第三堂
- 第三堂(1)为ListView元件建立自定画面
- 第三堂(2)储存与读取应用程式资讯
- 第三堂(3)Android 内建的 SQLite 数据库
- 第四堂
- 第四堂(1)使用照相机与麦克风
- 第四堂(2)设计地图应用程式 - Google Maps Android API v2
- 第四堂(3)读取装置目前的位置 - Google Services Location
- 第五堂
- 第五堂(1)建立广播接收元件 - BroadcastReceiver
- 第五堂(2)系统通知服务 - Notification
- 第五堂(3)设计小工具元件 - AppWidget
- 第六堂
- 第六堂(1)Material Design - Theme与Transition
- 第六堂(2)Material Design - RecylerView
- 第六堂(3)Material Design - Shared Element与自定动画效果