在关羽介绍Android时,刘备作出全神贯注状,时不时点头称是,心想,可不能让二弟发现我啥也不懂,那做大哥的可丢人丢到姥姥家了。而张飞在一旁一直处于半醒半睡状态,有时呼噜打得连旁边的树枝都随之震颤。
刘备推了推张飞,“三弟,三弟,醒醒!”
张飞醒转过来,用迷离的眼神看了看刘、关二人,“到饭点了?”
刘备说:“三弟真是个吃货,不过我们一直坐在这里也不是办法,不如找一家酒肆详谈?”
张飞忙道:“那还等啥,赶紧走起!”
于是三人来到一家酒肆,酒肆招牌写着,一家酒吧,二两每位,无限畅饮, WIFI免费。
三人进来坐定,点了酒水小吃之后,关羽从裤兜里掏出一个15寸笔记本,摆到桌子上。
张飞惊叹道:“二哥好力气!一直带个这么沉的笔记本竟能如此行走自如!”
刘备说:“二弟好裤兜才是真的,你这个笔记本到底是怎么装在裤子里的……”
关羽连忙用手护住下盘,“哎,大哥,三弟,不要老是对我的裤子动手动脚,让人看见影响多不好!让我们先聊点正事。我也是最近才开始研究Android开发,给大哥、三弟分享下我一点点研究心得。嗯……首先就讲讲如何搭建Android开发环境吧!嗯?三弟,你有问题吗?不用把手举起来,直接问就好了,咱们兄弟之间不用搞这么拘谨。”
“二哥,嘿嘿,我有个问题哈,那个……啥是Android来着?”,张飞问。
“晕……”
1.1. Android开发准备工作
在开始Android开发之旅之前,首先要搭建环境。需要下载Android软件开发工具包Android SDK(software development kit)和集成开发环境EclipseIDE(Integrated Development Environment)。Android 开发可以在Windows、Mac OS或 Linux 上进行。本书仅介绍在Windows下的开发环境搭建,如果你想在MacOS或Linux上进行Android开发,请下载系统对应版本的Eclipse及Android SDK。
Android 应用程序是用 Java 语言编写的,在 Eclipse 中用 Java 语言编程非常简单。Eclipse 提供了一个丰富的 Java 开发环境,包括自动补全和代码提示等等。代码通过编译后,使用Android开发插件ADT(Android Developer Tools)可自动生成Android安装包apk文件。
1.1.1.JDK的安装和配置
Java软件开发工具包JDK(Java Development Kit)是美国SUN(Stanford University Network)公司针对Java开发的产品。JDK包括了Java的运行环境,工具和基础类库。
下载JDK
首先根据自己电脑的操作系统,从官网http://www.oracle.com/technetwork/java/index.html下载我们需要的JDK安装包。建议同时下载Java Documentation,这是Java的帮助文档,将会大大方便我们今后的开发工作。下载来的JDK安装包如下图所示,
安装JDK
用鼠标左键双击下载来的JDK安装包,然后一直点击“下一步”按钮,途中会出现安装界面。点击“更改”按钮,可以更改JDK的安装目录,默认的安装目录在“C:\ProgramFiles\”下。我们可以根据需要选择不同的安装路径和安装内容。
JDK的环境变量配置
完成了JDK的安装之后,还要配置一系列环境变量才能使用JDK环境进行Java开发。要配置的环境变量包括JAVA_HOME,CLASSPATH和PATH三个部分。
1. 用鼠标右键点击“我的电脑”,选择“属性”→“高级”→“环境变量”→“系统变量” →“新建”。在“变量名”输入框中写入“JAVA_HOME”,在“变量值”输入框中输入安装路径。这里我们写入“C:\ProgramFiles\Java\jdk1.7.0_05”(根据安装路径填写)。然后点击“确定”按钮,JAVA_HOME的设置就完成了。
2. 下面开始“CLASSPATH”的配置。选中“系统变量”查看是否有CLASSPATH项目,如果没有就点击“新建”,如果已经存在就选中CLASSPATH选项,点击“编辑”按钮。然后在“变量名”中填写“CLASSPATH”,在“变量值”中填写“C:\ProgramFiles\Java\jdk1.7.0_05\jre\lib”(根据安装路径填写)。
3. 最后要进行的是“PATH”的配置。选择“变量名”输入框填写“PATH”,“变量值”输入框填写“C:\Program Files\Java\jdk1.7.0_05\bin”(根据安装路径填写)。
至此,JDK的环境变量已经配置完成。可以通过打开命令提示符窗口,输入命令“java –version”来查看Java版本的信息,确定安装是否成功。如图2-1所示:
图2-1 JDK的版本信息
如上图所示,JDK的版本信息已经全部显示出来了。说明JDK已经成功安装和配置完成,我们就可以开始进行Java开发了。
1.1.2.Eclipse的下载和安装
Eclipse 是一个著名的开源跨平台的集成开发环境(IDE)。最初主要用来java语言开发,但是目前也有人通过Eclipse插件使其作为其他计算机语言比如C++和Python的开发工具。Eclipse本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。
Eclipse的运行环境
在下载和安装Eclipse之前,我们得先确认计算机上是否安装了java运行环境(jre)。因为Eclipse是用Java编写的应用,运行时需要jre。如果jre没有安装或者没被检测到,那么我们打开Eclipse时将会报错。JDK中包含了jre,JDK的安装和配置请参见2.1.1节。
Eclipse的下载和安装
我们可以从官网http://www.eclipse.org/downloads/下载Eclipse安装包。下载完成后,打开下载的Eclipse安装包,解压缩并运行其中的eclipse.exe文件,开始对Eclipse进行安装。
在安装时可以勾选默认将全部工程文件统一存放到workspace的选择框。这样,当创建新项目时我们就知道应该到哪个目录结构中去寻找源文件。在开发Android的过程中,有时我们需要脱离Android开发环境去浏览项目文件,所以知道它们的准确位置非常有用。选择workspace的位置之后,点击确定按钮,Eclipse就安装完成了。
虽然Eclipse的安装看起来非常快,但是我们在创建第一个Android项目之前,还需要做一些配置工作。大部分配置工作都集中在Android SDK和ADT上。
关羽:大哥!Eclipse可是个非常高科技的东西!它不仅可以使用上面的方式进行安装,也可以解压绿色安装。最适合像咱们这种初级开发者了~ |
1.1.3.Android SDK的下载和安装
Android SDK的下载
Android SDK指的是Android专属的软件开发工具包。
首先,进入官网http://developer.android.com/sdk/index.html。我们可以看到,Google官方提供了包括Windows平台在内的多个Android SDK版本下载。在这里,Google官方推荐我们下载EXE安装包,而另一种方法是下载ZIP压缩包(无需安装)。本书中我们使用后者,两者在实际使用上没有什么区别,大家可以根据自己的需要选择。
Android SDK的安装
1. 下载并解压后,如图2.3所示。在运行SDK Manager.exe之前,需要确保我们的电脑上已经安装了JDK。
2. 运行SDK Manager.exe,程序将读取服务器上的相关资源,并以列表的形式推送给用户查看。在主界面左侧,分别显示着五个项目:Virtual devices(模拟器)、Installed packages(已安装的程序包)、Available packages(可用的程序包)、Settings(设置)、About(关于)。
3. 点选“Available packages”,可以看到可用的程序包。在需要安装的程序包前打勾,点击右下角的“Install packages”即可开始下载,如图2-2所示。下载完成后程序将自动进行安装。
图2-2 Android SDKManager界面
下载过程中若出现错误,可在“Settings”中勾选“Force https://... sources to be fetched using http://...”解决。程序包安装完成后,可以在“Installed packages”中查看,如图2-3所示。
图2-3 已安装软件
SDK包括:
l android.jar:Java 归档文件,其中封装了绝大部分开发用的工具包。
l docs目录:包含本地和网上提供的帮助文档,主要形式为JavaDocs。文档还包括一个高级开发指南和Android社区的链接。
l Samples目录:Samples子目录包含各种应用程序的源代码,包括 ApiDemo,该应用程序示范了很AndroidAPI(应用程序编程接口Application Programming Interface)的用法。这些示例应用程序可以作为Android应用程序开发的良好起点。
l Tools目录:包含所有用于构建Android应用程序的命令行工具。最常用、最有用的工具是adb实用程序(Android DebugBridge)。使用adb我们可以在Eclipse中,通过DDMS来调试Android程序,说白了就是debug工具。
l usb_driver:该目录包含将开发环境连接到支持Android的设备(例如G1或Android Dev 1解锁开发手机)所需的驱动程序。只有使用Windows平台的开发人员才需要这些文件。
环境变量的配置
1. 安装完选中的程序包后,我们需要设置Android 环境变量。在“我的电脑”上点右键,“属性”→“高级”→“环境变量”→“系统变量”。 编辑PATH 变量,变量值为 SDK 安装路径下的tools。这样,Android SDK 就安装好了。
2. 打开命令提示符窗口,输入:“android –help”,应该能够看到帮助信息显示Android SDK 安装成功。
关羽:大哥!配置Android的环境变量不是配置Android开发环境的必须步骤。不过配置此项后,就可以在命令提示符中直接输入adb各种操作命令啦! |
1.1.4.ADT的安装
Eclipse ADT是Eclipse平台下用来开发Android应用程序的插件。ADT能够在Eclipse上正常使用的关键是它们的版本要兼容。因此推荐在线安装ADT插件,它会根据Eclipse版本自动找到对应版本。
在线安装ADT插件
启动Eclipse,选择“Help”,“Install New Software”准备安装插件。在打开的对话框中点击“Add”按钮,在弹出的界面中点击“Add Site”,然后在“Location”中输入Android ADT插件的在线下载地址https://dl-ssl.google.com/android/eclipse/,点击“OK”按钮就可以自动下载安装了。
本地安装ADT插件
如果由于种种原因无法在线安装ADT插件,可以先下载ADT插件到自己的电脑上,然后再安装。ADT插件的下载地址是http://dl.google.com/android,然后在刚刚“Location”的界面点击“Archive”,找到刚刚下载的ADT插件。也可以点击“Local”按钮,找到解压之后的ADT插件,这样就可以本地安装了。本地安装的一个缺点就是要注意ADT插件版本与Eclipse版本的兼容问题。
创建Android Virtual Device(AVD)
1. AVD是Google提供的Android虚拟机,它能模拟出安卓手机的绝大部分功能和特性。通过AVD,即使我们没有安卓手机也可以轻松进行安卓开发。那么,如何创建AVD呢?在Eclipse中点击“window”→“Android SDK and AVD Manager”。在打开的窗口的左侧选择“Virtual Devices”选择“New”,打开创建AVD的界面,如图2-4所示,
图2-4 创建AVD的界面
2. 接着,输入AVD名称,选择Target,然后输入模拟的SDCard的容量大小,选择一个外观皮肤Skin,最后点击“Create AVD”按钮创建AVD。
图2-5 Android模拟器
3. 创建AVD成功后,在列表里选择新建的要运行的模拟器。单击“Start”,然后单击“Launch”进入模拟器的启动界面。首次运行需要可能几分钟的时间,请耐心等待。运行结果如图2-5所示。
1.2.创建第一个Android项目
在完成了Android的准备开发工作之后,现在可以开始编写第一个Android应用程序了。下面我们将编写一个简单的“Hello Android!”程序。通过编写这个程序,我们将学习如何创建,运行并调试该程序。
1.2.1.创建HelloAndroid项目
首先启动Eclipse,然后选择“File”→“New”→“Project”,弹出“New Project”对话框,选择Android,然后将看到New Android App对话框,如图2-6所示。
图2-6 New Android Project 对话框
这里我们在对话框中的“Application Name”栏里输入“HelloAndroidApp”作为应用程序名称; “Project Name”栏里输入“HelloAndroid”作为项目名称;在“Package Name”栏里输入“com.example.helloandroid”作为包名称;在“Build SDK”里勾选合适的Android版本进行开发。在这里我们使用Android SDK版本4.0进行开发。接着一直点击“Next”,最后点击“Finish”按钮,ADT会自动生成Android的项目框架,如图2-7所示。
图2-7 Android项目框架
进入src文件夹下的com.example.helloandroid包,可以看到MainActivity.java文件。这是我们HelloAndroid的主界面程序,一个Activity对应一个界面。我们在MainActivity里编写主界面的逻辑。双击打开MainActivity文件,可以看到已经默认给出了一个onCreate方法,这个方法会在Activity启动时运行。我们将onCreate(BundlesavedInstanceState)函数修改如下:
public class MainActivity extends Activity {
@Override
public void onCreate(BundlesavedInstanceState) {
//调用父类(Activity)的启动函数
super.onCreate(savedInstanceState);
//新建一个TextView
TextView tv = new TextView(this);
//设置TextView要显示的文字
tv.setText("Hello Android");
//设置当前Activity布局,为TextView
setContentView(tv);
}
}
在Android里界面由一些称之为视图的不同层次的类组成。一个视图就是一个简单的对象。如一个文本框,单选框,按钮等等。TextView就是一种专门处理文本的控件。在前面的例子中,我们就创建一个TextView:
TextView tv = newTextView(this);
参数this就是当前Activity的Context(上下文实例)。这个Context仅仅是指向系统的一个句柄。它提供像资源处理之类的服务,包含一些进入资料库以及参数选择的入口。创建TextView后,加入需要显示的内容:
tv.setText("HelloAndroid");
最后一步就是让TextView在屏幕上显示出来:
setContentView(tv);
Activity里setContentView()的方法,表明哪个视图需要在当前UI上显示。如果一个Activity不调用这个方法,那么当前界面就会显示为一个空白屏幕。
1.2.2.运行并调试HelloAndroid
我们将要学习运行并调试第一个Android程序。在这之前,需要确保我们已经创建了AVD(Android虚拟机)。
运行HelloAndroid
选中HelloAndroid工程,点击“Run”→“Run as”→“AndroidApplication”开始运行程序,运行结果如图2-8所示。
图2-8Hello Android运行结果
调试HelloAndroid
在Eclipse开发工具中调试Android程序的方法有很多,使用Eclipse调试Android程序时需要注意一些细节上的问题。我们重点介绍两种调试Android程序的方法,一是使用Eclipse的断点调试,二是使用Google提供的ADT插件中的LogCat来调试Android程序。读者可以根据自己的需要选择不同的方式进行调试,根据不同的错误采取不同的方式进行调试,使错误能快速地出现在眼前。
l Eclipse的断点调试
打开MainActivity.java 文件,遍历代码,将鼠标放在可疑代码一行的标记栏(在编辑器区域的左侧)上,双击即可设置断点。在某行打上断点后,在行号位置会出现一个浅蓝色圆点。这里注意, Eclipse不支持为同一行上的多条语句设置行断点。
之后,选择“Debug as”→“Android Application”。当程序运行到设置断点的部分时,Eclipse 会弹出对话框,提示是否切换到 Debug 模式。进入Debug模式,可以看到程序停在了断点所在位置。我们可以按F8继续执行,F5跳入函数内部。
一旦找到错误发生的位置,我们可能想知道在程序崩溃之前它在做什么。一种方法是单步执行程序的每行语句,直到运行到可疑的那一行。有时候最好只运行一段代码,在可疑处停止运行,检查数据。另一种方法是声明条件断点,断点在表达式值发生变化时触发。
要在 Debug 视图中挂起执行线程,选择一个运行线程,单击 Debug 视图工具栏中的 Suspend。该线程的当前调用堆栈就会显示出来,当前执行的代码行就会在 Debug 透视图中的编辑器中高亮显示。挂起一个线程时,将鼠标放在 Java 编辑器中的变量上,该变量的值就会在一个小的悬停窗口中显示出来。此时,该线程的顶部堆栈框架也会自动选中,其中的可视变量也会在 Variables 视图中显示出来,可以通过单击 Variables 视图中合适的变量名来检查变量。
l LogCat调试
在Eclipse中点击“Window”→“ShowView”→“LogCat”,显示LogCat窗口。
LogCat通过android.util.Log类的静态方法来查找错误和打印系统日志消息。它是一个进行日志输出的API,我们在Android 程序中可以随时为某一个对象插入一个Log,然后在DDMS中观察Logcat的输出是否正常。android.util.Log常用的方法有以下5个:
Log.v(String tag, String msg);
Log.d(Stringtag, String msg);
Log.i(Stringtag, String msg);
Log.w(Stringtag, String msg);
Log.e(Stringtag, String msg);
这5种方法的首字母分别对应VERBOSE、DEBUG、INFO、WARN、ERROR。当利用DDMS进行调试时,它们的区别并不大,只是显示的颜色不同。我们可以控制只显示其中一种或几种打印。一般我们如果使用“断点”方式来调试程序,则使用Log.e比较合适。
下面我们对“HelloAndroid”程序进行调试,首先在“MainActivity.java”的代码中修改并加入需要输出的日志信息,如下所示:
public class MainActivity extends Activity {
/*定义TAG标签,这样可以很好的区分打印出来的log */
private static final String TAG ="HelloAndroid";
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText("HelloAndroid");
setContentView(tv);
Log.v(TAG,"VERBOSE");
Log.d(TAG,"DEBUG");
Log.i(TAG,"INFO");
Log.w(TAG,"WARN");
Log.e(TAG,"ERROR");
}
}
运行程序,在LogCat窗口即可查看我们刚刚在程序中打印的log信息。如图2-9所示,这里Log使用不同颜色表示了不同等级的信息。这样我们就可以方便的对程序进行跟踪,使得调试Anroid程序更加方便。
图2-9输出的Log信息
1.3.HelloAndroid项目的结构分析
现在我们再来打开上一节中建立的HelloAndroid项目,分析其项目目录结构,对Android项目进一步的深入了解。首先展开“Package Explorer”导航器中的“HelloAndroid”项目,如上一节中图2.7所示。
1.3.1.Android项目的目录结构
src目录
像普通java项目一样,src目录中存放的是该项目的源代码,其内部结构会根据用户所声明的包自动组织。程序员在项目开发过程中,大部分时间是对该目录下的源代码文件进行编写。
gen目录
gen目录中存放所有由Android开发工具自动生成的文件,目录中最重要的就是R.java文件。该目录下的文件是由ADT自动生成的,并不需要人为地去修改。实际上该目录下只定义了一个R.java文件。该文件相当于项目的索引。项目中所使用的用户界面、字符串、图片、声音等资源都会由ADT工具在该类中创建唯一的ID。当使用这些资源时,会通过该类得到资源的引用。我们将在下一小节中详细介绍R.java文件。
res目录
res是resources的缩写,顾名思义,我们程序中所需要的文字,图片,布局文件等等资源都是放在这个文件夹下面的,我们现在看到这个文件夹下面有
l res/drawable:专门存放图标文件,可以看到res文件目录下有4个drawable文件夹,分别为drawable-xhdpi、drawable-hdpi、drawable-mdpi和drawable-ldpi。其中drawable-xhdpi和drawable-hdpi里面存放高分辨率的图片,如WVGA(480x800),FWVGA(480x854)。drawable-mdpi里面存放中等分辨率的图片,如HVGA(320x480)。drawable-ldpi里面存放低分辨率的图片,如QVGA(240x320)。系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。在开发程序时为了兼容不同平台不同屏幕,建议在各自文件夹下根据需求存放不同分辨率的图片。
关羽:告诉你们一个秘密!放在这里的图像资源可能会被aapt工具自动地进行无损压缩优化。比如,一个真彩色但并不需要256色的PNG可能会被转换为一个带调色板的8位PNG。这使得同等质量的图片占用更少的资源。所以我们得意识到这些放在drawable目录下的二进制图像在被打包成apk时可能会发生变化。如果你想读取一个图像数据并转换成一个位图(bitmap),可以把图像文件放在res/raw/目录下,这样可以避免被自动优化。
|
l res/layout:专门存放xml布局文件。xml界面文件和HTML文件一样,主要用于用户界面显示。
l res/values:专门以xml文件的格式存放应用程序使用到的各种常量。与其他的res中的文件夹不同的是,它可以保存任意数量的文件。Android使用xml元素类型控制这些资源应该放在R.java的什么地方。尽管这个文件夹里的文件可以任意命名,不过下面是一些比较典型的文件命名方式:array.xml(数组),colors.xml(颜色),dimens.xml(尺寸值),strings.xml(字符串),styles.xml(样式对象)。
Android 4.0.3目录
该目录中存放的是该项目支持的jar包。
AndroidDependencies目录和libs目录
从SDK版本16开始,Android项目中多了一个名为“Android Dependencies”的库应用文件夹。这是Android第三方库新的引用方式。当你需要引用第三方库时,只需在项目中新建一个名为“libs”的文件夹,然后将所有第三方包拷贝到该目录下。当eclipse启动时,ADT就会自动帮你完成库的引用,而不需要像以前一样自己Build Path,也不再需要Referenced Libraries了。
assets目录
该目录用于存放项目相关的资源文件,例如文本文件等。与res目录的不同点在于,assets支持任意深度的子目录。这些文件不会生成任何资源ID,必须使用/assets开始(不包含它)的相对路径名进行读写。
bin目录
用于存放编译后的应用程序。
project.properties
该文件为项目的配置文件,不需要人为改动,系统会自动对其进行处理。其中主要描述了项目的版本等信息。
1.3.2.自动生成的R.java
R.java是在建立项目时自动生成的,这个文件是只读模式,不能更改。Android自己维护这一个public final class R类主要是为了更新资源文件。R.java文件无需我们自己修改,它定义的每个资源值都是唯一的,不会和系统冲突。这个文件由ADT插件自动更新,当你编辑过res目录中的文件后保存,这个类就会自动更新。R.java文件是定义该项目所有资源的索引文件。
android工程所有资源信息都是由HashMap<Integer,Object>来存储的,key值就是R.java中的静态变量值,value就是相对应的各种对象信息(例如组件、图片、字符等等)。当工程被载入时,所有资源都被加载到HashMap中去,这样我们就可通过key值定位到相应的资源。
资源加载的过程大致如下:
1. 解析res文件夹下的各种文件,如果是xml文件调用java反射机制解析成相应的对象;
2. 由res文件夹下文档的目录层级结构来匹配R.java中相对应的静态变量名称,并取出变量值作为key值;
3. 将步骤2中key值和步骤1中的value值放入到HashMap<Integer,Object>中。
而Context类中的getResource()方法实际上就是返回这个HashMap对象。
Android开发工具会自动根据你放入res目录的xml界面文件、图标与常量,同步更新修改R.java文件。R.java在应用中起到了索引的作用,通过R.java,应用可以很方便地找到对应资源。另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎打包,这样可以减少应用在手机中占用的空间。
我们看看前面建立的HelloAndroid项目下的R.java文件,其代码如下所示:
packagecom.example.helloandroid;
publicfinal class R {
public static final class attr {
}
public static final class dimen {
public static final intpadding_large=0x7f040002;
public static final intpadding_medium=0x7f040001;
public static final intpadding_small=0x7f040000;
}
public static final class drawable {
public static final intic_action_search=0x7f020000;
public static final intic_launcher=0x7f020001;
}
public static final class id {
public static final intmenu_settings=0x7f080000;
}
public static final class layout {
public static final intactivity_main=0x7f030000;
}
public static final class menu {
public static final intactivity_main=0x7f070000;
}
public static final class string {
public static final intapp_name=0x7f050000;
public static final inthello_world=0x7f050001;
public static final intmenu_settings=0x7f050002;
public static final inttitle_activity_main=0x7f050003;
}
public static final class style {
public static final intAppTheme=0x7f060000;
}
}
可以看到这里定义了很多静态类,仔细一看就发现这些类名都与res文件夹中的文件名相同。有了这个文件,在程序中使用资源将变得更加方便,可以很快地找到要使用的资源,由于这个文件不能被手动编辑,所以当我们在项目中加入了新的资源时,只需要刷新一下该项目,R.java文件便自动生成了所有资源的索引。
1.3.3.Android工程配置文件(AndroidManifest.xml)
AndroidManifest.xml文件为应用程序的系统控制文件。它位于整个项目的根目录,每一个应用程序都必须包含它,是应用程序的全局描述文件。该文件标明应用程序包含哪些组件、哪些资源及何时运行该程序等信息。例如当你新添加一个Activity的时候,需要在这个文件中进行相应配置。该文件包含的信息如下:
l package="com.example.helloandroid",应用程序的包名:指定本应用内java主程序包的包名。当没有指定apk的文件名时,编译后产生的apk安装文件将以此包名命名。本包名应当在Android系统运行时唯一。
l android:minSdkVersion="8",SDK级别:标识本应用运行的SDK版本。
l android:targetSdkVersion="15",声明应用程序需要的链接库。
l 认证(certificate),权限组(permission-group),权限(permission),权限树(permission-tree),使用权限(uses-permission):应用程序自身应该具有的权限的声明和其他应用程序访问应用程序时应该具有的权限,我们将在下一节中详细介绍Android应用程序的权限。
l 此外,还包括Application,Activity,Receiver,Service等的声明,我们将在下面例子中作详细的介绍。
我们以前面建立的HelloAndroid项目里的AndroidManifest.xml文件的代码为例子,其代码如下所示,
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloandroid"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<manifest>
l xmlns:android:Android命名空间,一般默认为http://schemas.android.com/apk/res/android,这样使得Android中各种标准属性能在文件中使用。
l package:指定本应用内java主程序包的包名,它也是一个应用进程的默认名称。
l android:versionCode:该值是int值,用来识别程序版本。代表app更新过多少次,比如第一版一般为1,之后若要更新版本就设置为2、3等等。
l android:versionName:这个名称是给用户看的,你可以将你的app版本号设置为1.1版,后续更新版本设置为1.2、2.0版本等等。
<uses-sdk>
该层描述了应用所需的api版本。在此属性中可以指定支持的最小版本,目标版本以及最大版本。
l android:minSdkVersion:最小版本,如“8”
l android:targetSdkVersion:目标版本,如“15”。
<application>
一个AndroidManifest.xml中必须含有一个Application标签。这个标签内声明了每一个应用程序的组件及应用程序的属性(如icon,label,permission等)。
l android:icon:声明整个app的图标,图片一般都放在drawable文件夹下。
l android:label:声明了整个app的名称,一般定义在资源文件Strings.xml中。
l android:theme:是一个资源的风格,它定义了一个默认的主题风格给所有的activity。当然也可以在自己的theme里面去设置它。
<activity>
声明了Android中Activity的相关信息。
l android:name:声明了Android项目中Activity的名称。
l android:label:定义了Activity的标题。
<intent-filter>
l <action>:action很简单,只有android:name这个属性。"android.intent.action.MAIN"表明此activity是作为应用程序的入口。
l <category>:category也只有android:name属性。常见的android:name值为“android.intent.category.LAUNCHER”。该值决定了应用程序是否显示在程序列表里。
1.3.4.应用程序权限说明
一个Android应用可能需要获得相关权限才能调用Android系统的功能。一个Android组件也可能被其它应用调用,因此它也需要声明调用自身所需要的权限。
l 声明该应用自身所拥有的权限
通过为<manifest.../>元素添加<uses-permission.../>子元素即可为自身声明权限。例如在<manifest.../>元素里添加如下代码:
<!--声明应用程序运行需要打电话权限-->
<uses-permissionandroid:name="android.permission.CALL_PHONE"/>
l 声明组件被调用时所需的权限
通过为应用的各组件元素,如<activity.../>元素添加<uses-permission.../>子元素即可声明调用该程序所需的权限。例如在<activity.../>元素里添加如下代码:
<!--声明调用组件需要发送短信的权限-->
<uses-permissionandroid:name="android.permission.SEND_SMS"/>
除了以上介绍的之外,Android提供了大量的权限,这些权限位于Manifest.permission类中。一般来说有如下一些常用的权限,如下表所示,
权限 | 说明 |
ACCESS_NETWORK_STATE | 允许应用程序获取网络状态信息的权限 |
ACCESS_WIFI_STATE | 允许应用程序获取Wi-Fi网络状态信息的权限 |
BATTERY_STATE | 允许应用程序获取电池状态信息的权限 |
BLUETOOTH | 允许应用程序链接匹配的蓝牙设备的权限 |
BLUETOOTH_ADMIN | 允许应用程序发现匹配的蓝牙设备的权限 |
BROADCAST_SMS | 允许应用程序广播收到短信提醒的权限 |
CALL_PHONE | 允许应用程序拨打电话的权限 |
CAMERA | 允许应用程序使用照相机的权限 |
CHANGE_NETWORK_STATE | 允许应用程序改变网络连接状态的权限 |
CHANG_WIFI_STATE | 允许应用程序改变Wi-Fi网络连接状态的权限 |
DELETE_CACHE_FILES | 允许应用程序的删除缓存文件权限 |
DELETE_PACKAGES | 允许应用程序删除安装包的权限 |
FLASHLIGHT | 允许应用程序访问闪光灯的权限 |
INTERNET | 允许应用程序打开网络SOcket的权限 |
MODIFY_AUDIO_SETTINGS | 允许应用程序修改全局声音设置的权限 |
PROCESS_OUTGOING_CALLS | 允许应用程序监听、控制、取消呼出电话的权限 |
READ_CONTACTS | 允许应用程序读取用户的联系人数据的权限 |
READ_HISTORY_BOOKMARKS | 允许应用程序读取历史书签的权限 |
READ_OWNER_DATA | 允许应用程序读取用户数据的权限 |
READ_PHONE_STATE | 允许应用程序读取电话状态的权限 |
READ_PHONE_SMS | 允许应用程序读取短信的权限 |
REBOOT | 允许应用程序重启系统的权限 |
RECEIVE_SMS | 允许应用程序接收、监控、处理短信的权限 |
RECEIVE_MMS | 允许应用程序接收、监控、处理彩信的权限 |
RECORD_AUDIO | 允许应用程序录音的权限 |
SEND_SMS | 允许应用程序发送短息的权限 |
SET_ORIENTATION | 允许应用程序旋转屏幕的权限 |
SET_TIME | 允许应用程序设置时间的权限 |
SET_TIME_ZONE | 允许应用程序设置时区的权限 |
SET_WALLPAPER | 允许应用程序设置桌面壁纸的权限 |
VIBRATE | 允许应用程序访问振动器的权限 |
WRITE_CONTACTS | 允许应用程序写入用户联系人的权限 |
WRITE_HISTORY_BOOKMARKS | 允许应用程序写历史书签的权限 |
WRITE_OWNER_DATA | 允许应用程序写用户数据的权限 |
WRITE_SMS | 允许应用程序写短信的权限 |
1.4.玄德有话说
刘备:二弟,为何eclipse总提示我R.java文件错误?
关羽:这时候需要刷新并Clean一下项目,Clean项目的方法是点击“Project”→“Clean”。必要时重启下Eclipse。
刘备:二弟,我Clean了啊,咋还不成?
关羽:这时候就需要点击“Perferences”→“General”→“Workspace”勾选“Build automaticlly”,再次进行编译。
刘备:果然好使,二弟真乃神人也!
刘备:我在配置ADT时出现问题“Failed to initialize MonitorThread: Unable to establish loopback connectionADB server didn't ACKfailed tostart daemon”怎么办?
关羽:dos下进入SDK目录下的tools目录,执行以下命令:
adb kill-server
adb start-server
如果还有这个问题,请大哥你确认防火墙是否关闭。
张飞:二哥呀,我在创建新的 Android 项目时出现异常:“An SDK Target must be specified”。这是怎么整的?
关羽:可以呀三弟,问题问得很深邃嘛~出现这个问题的原因是Google Android SDK 没有安装完整。解决方法是打开Eclipse,点击“Window”→“Android SDK and AVD Manager”,选择 Android SDK Tools ,revision3 进行Update all就可以了。