indows上的android开发环境软件架构5
(二)实验要求:
修改按下button 显示的内容中添加上自己的学号姓名;
添加一个按钮,按钮名称为“退出”,并且为这个按钮添加事件代码,使得点击这个按钮后退
出程序。事件代码如下:
FullscreenActivity.this.finish();
添加完成后编译,把生成的apk 传到手机上安装运行查看结果
(二) android介绍
Android 是一种基于Linux 的自由及开放源代码的操作系统,主要使用于便携设备,如智能手机和平板
电脑。中国大陆地区较多人使用“安卓”或“安致”。Android 操作系统最初由Andy Rubin 开发,主要支持手机。
2005 年由Google 收购注资,并组建开放手机联盟开发改良随后,逐渐扩展到平板电脑及其他领域上。
Android系统结构
系统内核
Android 是运行于Linux kernel 之上,但并不是GNU/Linux。因为在一般GNU/Linux 里支持的功能,
Android 大都没有支持,包括Cairo(矢量绘图库)、X11(窗口系统)、Alsa(高级Linux 声音架构)、FFmpeg(图片)、
GTK(图形界面应用程序开发工具)、Pango(国际化文本处理库)及Glibc(GNU C 标准库)等都被移除掉了,就好比
Android 之前的基于J2ME 开发的Java 操作系统手机实际上是一个精简的Java 虚拟机。Android 又以bionic 取
代Glibc、以Skia 取代Cairo、再以opencore 取代FFmpeg 等等。Android 为了达到商业应用,必须移除被
GNU GPL 授权证所约束的部份。
硬件抽像层
Android 的HAL(硬件抽像层)是能以封闭源码形式提供硬件驱动模块。HAL 的目的是为了把Android
framework 与Linux kernel 隔开,让Android 不至过度依赖Linux kernel,以达成kernel independent 的概
念,也让Android framework 的开发能在不考量驱动程序实现的前提下进行发展。
中介软件
Android 采用OpenCORE 作为基础多媒体框架;使用skia 为核心图形引擎,搭配OpenGL/ES;多媒体数据
库采用SQLite 数据库系统;它的中间层多以Java 实现,并且采用特殊的Dalvik 虚拟机(Dalvik Virtual
Machine),Dalvik 虚拟机可以有多个实例(instance), 每个Android 应用程序都用一个自属的Dalvik 虚拟机
来运行,让系统在运行程序时可达到优化。Dalvik 虚拟机并非运行Java 字节码(Bytecode),而是运行一
种称为.dex 格式的文件。
Android 应用程序开发
Android 应用程序使用Java 做为开发语言。aapt 工具把编译后的Java 代码连同其它应用程序需要的数
据和资源文件一起打包到一个Android 包文件中,这个文件使用.apk 做为扩展名,它是分发应用程序并安
装到移动设备的媒介,用户只需下载并安装此文件到他们的设备。单一.apk 文件中的所有代码被认为是一
个应用程序。
从很多方面来看,每个Android 应用程序都存在于它自己的世界之中:
默认情况下,每个应用程序均运行于它自己的Linux 进程中。当应用程序中的任意代码开始执行
时,Android 启动一个进程,而当不再需要此进程而其它应用程序又需要系统资源时,则关闭这
个进程。
每个进程都运行于自己的Java 虚拟机(VM)中。所以应用程序代码实际上与其它应用程序的代
码是隔绝的。
默认情况下,每个应用程序均被赋予一个唯一的Linux 用户ID,并加以权限设置,使得应用程序
的文件仅对这个用户、这个应用程序可见。当然,也有其它的方法使得这些文件同样能为别的
应用程序所访问。
使两个应用程序共有同一个用户ID 是可行的,这种情况下他们可以看到彼此的文件。
Android 五大组件及相关类
活动—Activity
Activity 是为用户操作而展示的可视化用户界面。比如说,一个activity 可以展示一个菜单项列表供用
户选择,或者显示一些包含说明的照片。一个短消息应用程序可以包括一个用于显示做为发送对象的联系
人的列表的activity,一个给选定的联系人写短信的activity 以及翻阅以前的短信和改变设置的activity。尽
管它们一起组成了一个内聚的用户界面,但其中每个activity 都与其它的保持独立。每个都是以Activity 类
为基类的子类实现。
服务—Service
服务没有可视化的用户界面,而是在一段时间内在后台运行。比如说,一个服务可以在用户做其它事
情的时候在后台播放背景音乐、从网络上获取一些数据或者计算一些东西并提供给需要这个运算结果的
activity 使用。每个服务都继承自Service 基类。
广播接收器—Broadcast
广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的
──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行
广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。
内容提供—ContentProvider
内容提供者将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite 数
据库或其它方式。内容提供者继承于ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现
了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个ContentResolver 对象,调用它
的方法作为替代。ContentResolver 可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行
管理。
意图—Intent
当接收到ContentResolver 发出的请求后,内容提供者被激活。而其它三种组件──activity、服务和广
播接收器被一种叫做intent 的异步消息所激活。intent 是一个保存着消息内容的Intent 对象。对于activity
和服务来说,它指明了请求的操作名称以及作为操作对象的数据的URI 和其它一些信息。比如说,它可以
承载对一个activity 的请求,让它为用户显示一张图片,或者让用户编辑一些文本。而对于广播接收器而言,
Intent 对象指明了声明的行为。比如,它可以对所有感兴趣的对象声明照相按钮被按下。
Android 程序结构
/src 目录下存放的是Android 程序核心代码。
/gen 目录下存放的是资源配置类BuildConfig.java 和R.java,提供给/src 中代码与/res 中资源连接的一个
桥梁。比较老的ADT 可能没有改目录,对应的类都一起放在/src 中,在此Eclipse 的ADT 中,可以所见所得
的设计界面,并自动更新R.java 文件。
/bin 目录下存放编译完成后的一些文件,包括*.apk。
/libs 目录下存放该项目要用的的Android 开发库。
/res 和/assets 目录下存放资源和资产以及一些说明文件,只是编译时有所不同。
AndroidManifest.xml 是组件配置文件以及一些项目属性文件。
当Android 启动一个应用程序组件之前,它必须知道那个组件是存在的。所以,应用程序会在一个
manifest 文件中声明它的组件,这个文件会被打包到Android 包中。这个.apk 文件还将涵括应用程序的代码、
文件以及其它资源。这个manifest 文件以XML 作为结构格式, 而且对于所有应用程序, 都叫做
AndroidManifest.xml,例如:
一个android 程序不像我们之前认识的c 和java 等程序是从main 函数作为入口开始执行的。它是从在
AndroidManifest.xml 中标注了‘android.intent.action.MAIN’和’android.intent.category.LAUNCHER’的activity
组件开始执行的,标明了这个activity 将在应用程序加载器中显示,就是用户在设备上看到的可供加载的应
用程序列表。换句话说,这个activity 是应用程序的入口,是用户选择运行这个应用程序后所见到的第一个
activity。而activity,service 组件如何执行又得看它们的生命周期:
Activity 组件类的主要函数:
void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()
上面几个函数控制Activity 的这三种状态之间的切换:
当在屏幕前台时(位于当前任务堆栈的顶部),它是活跃或运行的状态。它就是相应用户操作
的activity。
当它失去焦点但仍然对用户可见时,它处于暂停状态。即是:在它之上有另外一个activity。这
个activity 也许是透明的,或者未能完全遮蔽全屏,所以被暂停的activity 仍对用户可见。暂停的
activity 仍然是存活状态(它保留着所有的状态和成员信息并连接至窗口管理器),但当系统处
于极低内存的情况下,仍然可以杀死这个activity。
如果它完全被另一个activity 覆盖是,它处于停止状态。它仍然保留所有的状态和成员信息。然
而它不在为用户可见,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这
个activity。
R.java 文件:
其中的id 属性对应了res/layout 中各个控件,从中我们知道界面有两个按钮button1 和button2 以及一个文
本编辑框editText1 等控件。String 表示一些字符串资源。所以R.java 其实就是一个资源配置索引文件。如
果我们需要在核心代码中添加对某些控件的处理比如button1,可以如下操作:
布局Layout:
在一个Android 应用中,用户界面是由View 和ViewGroup 对象构建的。View 与ViewGroup 都有很多种类,
而它们都是View 类的子类。定义并展现你的视图层次的最常用的方法是使用XML 布局文件,XML 元素的名
称与它体现的Java 类相对应。所以一个<TextView>元素将在你的UI 中生成一个TextView,而<LinearLayout>
则创建一个LinearLayout 视图组。当你载入一个布局资源时,Android 系统会根据你布局中的元素初始化这
些运行时对象,举例来说,一个包含文本视图和一个按钮的简单垂直布局如下:
以上介绍了Android 的一些基本情况,当然还有很多内容没有覆盖到,如果对此感兴趣,可以网上查找
Android 的相关文档和源代码进行学习。
(四)实验内容:
1、下载adt-bundle-windows-x86 包(该文件可以到android 官网下载),解压到当前文件夹,打开其中的eclipse
文件夹下的eclipse.exe(该eclipse 已经默认装好了android sdk)。
2、点击Android Virtual Device Manager——Device Definitions——选择适合的设备——Create AVD 来建立一
个android 虚拟设备(也可以使用真机作为调试设备)。
3、回到主界面,点击File——New——Android Application Project 来创建一个Android 项目,取名Lab6,一
路Next 到最后选择FullScreenActivity,再点击Finish 完成。
4、在Package Explorer 中看到Lab6
5、打开res/layout 目录下的activity_main.xml 进行编辑。
6、在Palette 的Layouts 中选择LinearLayout(Vertical)左键点击不放拖到右侧的图形界面上并覆盖DUMMY
CONTENT 和Dummy Button 区域,如下图所示:
7、接着在Outline 中右键点击LinearLayout——Assign ID——输入名字如lab6layout——OK.
8、用同样的方法添加一个TextView 和Button 控件,它们可从Form Widgets 中选择。
9、添加完成后在Outline 中的textView1 和button1 的图标下有两个感叹号,只要点击button1,再点击下
面的Text 如下红线中的按钮——点击New String——在String 中输入”hello”——在New R.string 中输入”bt”
——点击OK(同样的办法对textView1,String 中为空,R.string 中为tv),这样对应的感叹号就消失了:
10、点击Save All 保存修改,查看/gen/com.example.lab6 包下面的R.java 如下:
11、打开/src/com.example.lab6 包下的FullscreenActivity.java 文件进行如下编辑:
1)在FullscreenActivity 类中添加三个变量如下:
运行程序总是出现unfortunately stop 后来思考,发现,原来是在界面还没有初始化前就想获得界面的一些对象,因此虽然编译没有报错,但是在运行时都是提前stop,修改获取界面对象的顺序后,就可以了。另一个是用其它方法实现进程结束(system.exit(0),等等三种方法),另一个是用真机实现联机调试,使用豌豆荚连接手机后,在调试的configure配置里,通过选择可以直接使用手机作为调试机子,而不用模拟器。