Android应用程序框架思路Word文档下载推荐.docx
《Android应用程序框架思路Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Android应用程序框架思路Word文档下载推荐.docx(19页珍藏版)》请在冰点文库上搜索。
由上图可看出,心脏应用程序框架主要分为三层:
UI层(Activities层),调度层(Dispatch层)和应用服务层(Services层)。
(比较类似于MVC的设计模式)
1.相对于一般框架的区别
(1)引入了Android提供的其他两大组件:
服务(Service)和广播接收器(Receiver),用于在后台一直运行一些监控程序(类似于symbian心脏中的WatchEngine.exe)和接收系统事件。
(2)提供了对外部应用程序访问的接口,有助于手机心脏将来为其他应用程序提供平台与服务。
2.三层结构的职责归属与交互方式
层次
组成
职责
与其他层次交互模式
UI层
Activities,Views
负责应用程序UI显示
负责进行跳转
与调度层进行交互
负责控制调度层对服务进行管理
只能与调度层进行交互,不可见服务层。
调度层
由服务管理模块,服务绑定模块,
消息转发模块,
异常通知模块组成
负责与后台服务的绑定与通信
负责处理UI层的请求
负责管理服务层相关服务
负责管理应用程序的异常输出。
与UI层通过本地接口进行交互。
与应用服务层通过远程接口AIDL进行通信。
应用服务层
由Service,Receiver,ContentProvider组成
负责与系统进行通信。
负责监控系统行为并处理。
负责与调度层进行消息通信。
与调度层通过远程接口AIDL进行通信,返回计算结果/事件等。
3.优点与缺点
(1)充分利用Android平台提供的组件达到使用需求(如监控系统事件,保持服务一直运行等),更本地化。
(2)可以应用系统性比较强的应用程序。
(1)AIDL进行交互比较繁琐。
四.Android项目的目录结构
首先启动Eclipse,展开"
PackageExplorer"
导航器中的"
hello"
项目,如图3-1所示。
与一般的Java项目一样,src文件夹是项目的所有包及源文件(.java),res文件夹中则包含了项目中的所有资源,比如:
程序图标(drawable)、布局文件(layout)、常量(values)等。
下面来介绍其他Java项目中没有的的gen文件夹中的R.java文件和每个Android项目都必须有的AndroidManfest.xml文件。
R.java是在建立项目时自动生成的,这个文件是只读模式,不能更改,R.java文件是定义该项目所有资源的索引文件。
先来看看hello项目的R.java文件,如代码清单3-1所示。
1.代码清单3-1R.java
可以看到这里定义了很多常量,仔细一看就发现这些常量的名字都与res文件夹中的文件名相同,这再次证明R.java文件中所存储的是该项目所有资源的索引。
有了这个文件,在程序中使用资源将变得更加方便,可以很快地找到要使用的资源,由于这个文件不能被手动编辑,所以当我们在项目中加入了新的资源时,只需要刷新一下该项目,R.java文件便自动生成了所有资源的索引。
AndroidManfest.xml文件则包含了该项目中所使用的Activity、Service、Receiver,我们先来打开hello项目中的AndroidManfest.xml文件,如代码清单3-2所示。
代码清单3-2AndroidManfest.xml
代码清单3-2中intent-filters描述了Activity启动的位置和时间。
每当一个Activity(或者操作系统)要执行一个操作时,它将创建出一个Intent的对象,这个Intent对象能承载的信息可描述你想做什么,你想处理什么数据,数据的类型,以及一些其他信息。
而Android则会和每个Application所暴露的intent-filter的数据进行比较,找到最合适Activity来处理调用者所指定的数据和操作。
下面我们来仔细分析AndroidManfest.xml文件,如表3-1所示。
表3-1AndroidManfest.xml分析
manifest
根节点,描述了package中所有的内容
xmlns:
android
包含命名空间的声明。
android=http:
//schemas.
Android中各种标准属性能在文件中使用,
提供了大部分元素中的数据
Package
声明应用程序包
application
包含package中application级别组件声
明的根节点。
此元素也可包含application
的一些全局和默认的属性,如标签、icon、
主题、必要的权限,等等。
一个manifest
能包含零个或一个此元素(不能大余一个)
android:
icon
应用程序图标
label
应用程序名字
Activity
用来与用户交互的主要工具。
Activity是用
户打开一个应用程序的初始页面,大部分
被使用到的其他页面也由不同的activity所
实现,并声明在另外的activity标记中。
注意,每一个activity必须有一个<
activity>
标记对应,无论它给外部使用或是只用于
自己的package中。
如果一个activity没有
对应的标记,你将不能运行它。
另外,
为了支持运行时查找Activity,可包含一个
或多个<
intent-filter>
元素来描述activity所支持的操作
name
应用程序默认启动的activity
intent-filter
声明了指定的一组组件支持的Intent值,从
而形成了IntentFilter。
除了能在此元素下指
定不同类型的值,属性也能放在这里来描
述一个操作所需的唯一的标签、icon和其他信息
action
组件支持的Intentaction
category
组件支持的IntentCategory。
这里指定
了应用程序默认启动的activity
uses-sdk
该应用程序所使用的sdk版本相关
四.AndroidManifest.xml文件的结构
每一个Android应用程序必须有一个AndroidManifest.xml文件(不能改成其他的文件名),而且该文件必须在应用程序的根目录中。
在这个文件中定义了应用程序的基本信息,在运行Android应用程序之前必须设置这些信息。
下面是AndroidManifest.xml文件在Android应用程序中所起的作用。
定义应用程序的Java包。
这个包名将作为应用程序的唯一标识。
在DDMS透视图的【FileExplorer】视图中可以看到data\data目录中的每一个目录名都代表着一个应用程序,而目录名本身就是在AndroidManifest.xml文件中定义的包名。
前面讲的4个应用程序组件在使用之前,必须在AndroidManifest.xml文件中定义。
定义的信息主要是与组件对应的类名以及这些组件所具有的能力。
通过AndroidManifest.xml文件中的配置信息可以让Android系统知道如何处理这些应用程序组件。
确定哪一个Activity将作为第一个运行的Activity。
在默认情况下,Android系统会限制使用某些API,因此,需要在AndroidManifest.xml文件中为这些API授权后才可以使用它们。
可以为授权应用程序与其他的应用程序进行交互。
可以在AndroidManifest.xml文件中配置一些特殊的类,这些类可以在应用程序运行时提供调试及其他的信息。
但这些类只在开发和测试时使用,当应用程序发布时这些配置将被删除。
定义了Android应用程序所需要的最小API级别,Android1.1对应的API级别是2,Android1.5对应的API级别是3,以此类推,最新的Android2.1对应的API级别是7。
指定应用程序中引用的程序库。
下面是AndroidManifest.xml文件的标准格式,这个格式中的各种标签将在后面的内容中逐渐讲到。
<
?
xmlversion="
1.0"
encoding="
utf-8"
>
manifestxmlns:
android="
package="
com.android.test"
android:
versionCode="
1"
versionName="
>
<
uses-sdkandroid:
minSdkVersion="
8"
/>
icon="
@drawable/ic_launcher"
label="
@string/app_name"
activity
name="
.HelloActivity"
intent-filter>
actionandroid:
android.intent.action.MAIN"
categoryandroid:
android.intent.category.LAUNCHER"
/intent-filter>
/activity>
/application>
/manifest>
2.Android应用程序组件
Activity(Android的窗体)
一个Activity通常展现为一个可视化的用户界面。
例如,一个activity可能展现为一个用户可以选择的菜单项列表或者展现一些图片以及图片的标题。
一个消息服务应用程序可能包含一个显示联系人列表的activity,一个编写信息的activity,以及其它一些查看信息和修改应用程序设置的activity。
虽然这些activity一起工作,共同组成了一个应用程序,但每一个activity都是相对独立的。
每一个activity都是Activity(android.app.Activity)的子类。
一个应用程序可能只包含一个activity,或者像上面提到的消息服务程序一样有多个activity。
一个应用程序包含几个activity以及各个activity完成什么样的功能完全取决于应用程序以及它的设计。
通常每个应用程序都包含一个在应用程序启动后第一个展现给用户的activity。
在当前展现给用户的activity中启动一个新的activity,可以实现从一个activity转换到另外一个activity。
每个activity都会有一个用于绘制用户界面的窗口。
通常这样一个窗口会填充整个屏幕,当然这个窗口也可以比屏幕小并漂浮在其他窗口之上。
activity还可以使用一些额外的窗口,例如一个要求用户响应的弹出式对话框,或者是当用户在屏幕上选择一个条目后向用户展现一些重要信息的窗口。
展示activity窗口的可视化内容区域是一些具有层次关系(很像数据结构中的树)的视图,而视图则是由类View的子类表示的。
每个视图控制窗口中的一个矩形区域。
父视图包含一些子视图并管理子视图的布局。
位于叶节点的视图直接控制并响应用户的动作。
因此视图就是activity与用户交互的接口。
例如,一个显示图片的视图,当用户单击的时候它可能会启动一个动作。
Android有许多开发人员可以直接使用的视图,包括按钮,文本域,滚动条,菜单,复选框等。
通过调用Activity.setContentView()方法来设置展现activity的窗口的视图。
内容视图则是视图层次结构中的根节点视图。
Service(服务)
service没有用户界面,但它会在后台一直运行。
例如,service可能在用户处理其它事情的时候播放背景音乐,或者从网络上获取数据,或者执行一些运算,并把运算结构提供给activity展示给用户。
每个service都扩展自类Serivce。
多媒体播放器播放音乐是应用service的一个非常好的例子。
多媒体播放器程序可能含有一个或多个activity,用户通过这些activity选择并播放音乐。
然而,音乐回放并不需要一个activity来处理,因为用户可能会希望音乐一直播放下去,即使退出了播放器去执行其它程序。
为了让音乐一直播放,多媒体播放器activity可能会启动一个service在后台播放音乐。
Android系统会使音乐回放service一直运行,即使在启动这个service的activity退出之后。
应用程序可以连接到一个正在运行中的service。
当连接到一个service后,可以使用这个service向外暴露的接口与这个service进行通信。
对于上面提到的播放音乐的service,这个接口可能允许用户暂停,停止或重新播放音乐。
与activity以及其它组件一样,service同样运行在应用程序进程的主线程中。
所以它们不能阻塞其它组件或用户界面,通常需要为这些service派生一个线程执行耗时的任务。
BroadcastReceiver(广播接收器)
broadcasereceiver不执行任何任务,仅仅是接受并响应广播通知的一类组件。
大部分广播通知是由系统产生的,例如改变时区,电池电量低,用户选择了一幅图片或者用户改变了语言首选项。
应用程序同样也可以发送广播通知,例如通知其他应用程序某些数据已经被下载到设备上可以使用。
一个应用程序可以包含任意数量的boradcasereveiver来响应它认为很重要的通知。
所有的broadcastreceiver都扩展自类BroadcastReceiver。
broadcastreceiver不包含任何用户界面。
然而它们可以启动一个activity以响应接受到的信息,或者通过NotificationManager通知用户。
可以通过多种方式使用户知道有新的通知产生:
闪动背景灯、震动设备、发出声音等等。
通常程序会在状态栏上放置一个持久的图标,用户可以打开这个图标并读取通知信息。
ContentProvider(内容提供者)
应用程序可以通过contentprovider访问其它应用程序的一些私有数据,这是Android提供的一种标准的共享数据的机制。
共享的数据可以是存储在文件系统中、SQLite数据库中或其它的一些媒体中。
contentprovider扩展自ContentProvider类,通过实现此类的一组标准的接口可以使其它应用程序存取由它控制的数据。
然而应用程序并不会直接调用ContentProvider中的方法,而是通过类ContentResolver。
ContentResolver能够与任何一个ContentProvider通信,它与ContentProvider合作管理进程间的通信。
任何时候当Android系统收到一个需要某个组件进行处理的请求的时候,Android会确保处理此请求的组件的宿主进程是否已经在运行,如果没有,则立即启动这个进程,当请求的组件的宿主进程已经在运行,它会继续查看请求的组件是否可以使用,如果不能立即使用,它会创建一个请求的组件的实例来响应请求。
3.Android程序的UI设计
这里所说的UI就是在我们所说的布局文件(layout),UI是一个应用程序的脸面,一个应用程序要想受用户喜爱,那么UI可不能差。
自从AndroidSDK1.0_r2版本开始,ADT提供了UI预览的功能。
现在我们只需要打开一个Android项目的"
/res/layout/main.xml"
并右键单击,依次选择OpenWith"
→"
AndroidlayoutEditor"
菜单命令,或者直接双击main.xml文件,即可以切换到UI设计界面,如图3-15所示。
(点击查看大图)图3-15AndroidlayoutEditor命令
左边的layouts标签的内容则是一些线性布局,我们可以使用它轻松地完成对布局的排版,比如横向或者纵向布局。
Views标签则是一些UI控件,我们可以将这些控件直接拖动到右边的窗口进行编辑,如图3-16所示。
(点击查看大图)图3-16AndroidlayoutEditor
当然,我们还可以点击右下角的main.xml标签来切换到XML编辑器,对代码进行编排,如图3-17所示。
将这些功能配合起来使用,基本可以满足开发者需求。
(点击查看大图)图3-17XML编辑器
除了这个还不算太成熟的UI编辑器之外,笔者曾经使用过一个第三方的工具DroidDraw,DroidDraw是一个公开了源代码的UI设计器,你可以根据自己的开发需要进行修改。
www.DroidDraw.org提供了在线使用DroidDraw的功能,当然你也可以下载到本地来进行编辑,下载地址:
DroidDraw的功能比较强大,可以直接拖动控件到窗口,然后设置其属性、参数等,这样你便可以随心所欲地设计自己需要的UI,然后点击"
Generate"
按钮即可生成出对应的布局代码,同时你也可以点击"
Load"
按钮来载入已经编辑好的布局文件,如图3-18所示。
(点击查看大图)图3-18DroidDraw操作界面
4.Activity的使用方法
下面简单介绍如何创建一个Activity。
一,创建一个继承自Activity的Java类;
二,OverrideActivity类中的onCreate方法;
在上面的代码中,你已经看到了,我们必须OverrideonCreate方法,因这这是一个Activity启动的方法,类似Java中的Main。
三,定义与该Activity使用的Layout文件;
你从上面的代码中也看到了,我们使用了一个叫main的Layout文件。
在该布局文件中,我们定义了一个水平的LinearLayout,在里面放置了一个EditText,同时还放置了另一个水平的LinearLayout,并在其内放置了两个button,一个显示的是“确定”,另一个显示的是“取消”。
四,在AndroidManifest.xml文件中配置Activity;
当上面的步骤完成之后,你的Activity并不能使用,因为是还没有在AndroidManifest.xml中进行配置。
在这里,我们把HelloActivity配置成了我们的应用启动时就运行的Activity。
5.Activity生命周期详解
Activity有三个状态:
1.当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或运行状态。
它就是响应用户操作的Activity。
2.当它上面有另外一个Activity,使它失去了焦点但仍然对用户可见时(如图),它处于暂停状态。
在它之上的Activity没有完全覆盖屏幕,或者是透明的,被暂停的Activity仍然对用户可见,并且是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接)。
如果系统处于内存不足时会杀死这个Activity。
3.当它完全被另一个Activity覆盖时则处于停止状态。
它仍然保留所有的状态和成员信息。
然而对用户是不可见的,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个Activity。
当Activity从一种状态转变到另一种状态时,会调用以下保护方法来通知这种变化:
voidonCreate(BundlesavedInstanceState)
voidonStart()
voidonRestart()
voidonResume()
voidonPause()
voidonStop()
voidonDestroy()
这七个方法定义了Activity的完整生命周期。
实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环:
Activity的完整生命周期自第一次调用onCreate()开始,直至调用onDestroy()为止。
Activity在onCreate()中设置所有“全局”状态以完成初始化,而在onDestroy()中释放所有系统资源。
例如,如果Activity有一个线程在后台运行从网络下载数据,它会在onCreate()创建线程,而在onDestroy()销毁线程。
Activity的可视生命周期自onStart()调用开始直到相应的onStop()调用结束。
在此期间,用户可以在屏幕上看到Activity,尽管它也许并不是位于前台或者也不与用户进行交互。
在这两个方法之间,我们可以保留用来向用户显示这个Activity所需的资源。
例如,当用户不再看见我们显示的内容时,我们可以在onStart()中注册一个BroadcastReceiver来监控会影响UI的变化,而在onStop()中来注消。
onStart()和onStop()方法可以随着应用程序是否为用户可见而被多次调用。
Activity的前台生命周期自onResume()调用起,至相应的onPause()调用为止。
在此期间,Activity位于前台最上面并与用户进行交互。
Activity会经常在暂停和恢复之间进行状态转换——例如当设备转入休眠状态或者有新的A