Android应用程序的结构和解析
什么是Android应用程序的构成?
Android应用程序的各个组件又是什么?
各个组件和AndroidManifest之间的关系是什么?
Android应用程序由松散耦合的组件组成,并使用应用程序Manifest绑定在一起;应用程序的AndroidManifest.xml文件描述了每个组件和它们之间的交互方式。还用于指定应用程序元数据、其硬件和平台要求、外部库以及必要的权限。
Android应用程序的组件:
Activity:是应用程序的表示层。应用程序中的每一个UI都是通过Activity类的一个或多个扩展实现的。Activity使用Fragment和视图来布局和显示信息,以及响应用户动作。
Service:应用程序中不可见的工作者。Service组件在运行时没有UI,它们可以更新数据源和Activity、触发通知和广播Intent。
Content Provider:一个可共享的持久数据存储器(谈到持久化存储机制,首先想到的是数据库)。Content Provider用来管理和持久化应用程序数据,通常会与SQL数据库交互。它是应用程序之间共享数据的首选方法。(个人认为:该功能更多的是提供数据访问,即是读数据)
Intent:一个强大的应用程序间的消息传递框架。Intent可以用来启动和停止Activity和Service,在系统范围内或向目标Activity、Service或Broadcast Receiver广播消息,以及请求对特定的一条数据执行操作。
Broadcast Receiver:Intent侦听器。Broadcast Receiver使应用程序可以监听到那些匹配指定的过滤标准的Intent广播。Broadcast Receiver会自动启动应用程序来响应某个收到的Intent,这个特点让Broadcast Receiver成为了事件驱动的应用程序的最佳选择。
Widget:通常会被添加到设备主屏幕的可视化应用程序组件。Widget是Broadcast Receiver的特殊变体。(这一点怎么理解?和Broadcast Receiver的关系是什么?Widget有什么功能?)
Notification:该组件允许向用户发送信息,但却不会过分吸引他们的注意力或者打断他们当前的Activity。这种方式是当应用程序不可见或不活动时吸引用户注意的首选方法。
AndroidManifest.xml文件简介:
每个Android应用程序都包含一个Manifest文件——AndroidManifest.xml,该文件存储在项目层次中的最底层。Manifest可以定义应用程序及其组件和需求的结构和元数据。
它包含了组成应用程序的每一个Activity、Service、Content Provider和Broadcast Receiver的节点,并使用Intent Filter和权限来确定这些组件之间以及组件和其他应用程序的交互方式。
该文件还可以指定应用程序的元数据(如:图标、版本号或主题风格)以及额外的顶层节点,这些节点用来指定必需的安全权限和单元测试,以及定义硬件、屏幕和平台支持要求。
特别需要注意的是:使用installLocation属性,指定是否允许(或首选)将应用程序安装到外部存储器而不是内部存储器上。
当把应用程序安装到外部存储器上时,如果用于使用USB大容量存储器想计算机复制文件,或如果用户拒绝或取出SD卡,应用程序将立即终止。上述情况将直接影响到用户体验,以下几类应用程序不适合安装到外部存储设备中:
1. 就有Widget、Live Wallpaper和Live Folder的应用程序;
2. 提供不中断服务的应用程序;
3. 输入法引擎;
4. 设备管理器。
内部存储器的容量一般是有限的,所以最好是只要有可能,就把应用程序安装到外部存储器上。
Manifest.xml文件中都有哪些标签或节点node?
该文件由根节点引导:<manifest...>,该node具有的属性值如下:
可用的节点node有以下几种:
节点node:uses-sdk,用于定义要想正确运行应用程序,设备上必须具有的最低和最高SDK版本,以及为应用程序设计的目标SDK,分别使用minSDKVersion,maxSDKVersion,targetSDKVersion属性设置。
需要注意的是:支持的SDK版本不等同于平台版本,也不能从平台版本导出(SDK--software development toolkit)。
节点uses-configuration:指定应用程序支持的每个输入机制的组合。一般不需要包含这个节点,不过对于需要特殊输入控制的游戏应用程序来说,非常有用。可以配置的属性值有:reqFiveWayNav,reqHardKeyboard,reqKeyboardType,reqNavigation,reqTouchScreen五种。在指定必需的配置时,如果设备不具有任意一种指定配置,则应用程序将不会安装到设备上。
节点uses-feature:指定应用程序需要的硬件功能,可以避免将应用程序安装到不包含必要的硬件功能(如NFC硬件)的设备上。
<uses-feature android:name="android.hardware.camera.autofocus" /> <uses-feature android:name="android.hardware.camera.flash" /> <uses-feature android:name="android.hardware.nfc"/>
包括:音频、蓝牙、摄像头、位置、麦克风、NFC、传感器、电话服务、触摸屏、USB、WIFI等。
节点supports-screens:指定应用程序中布局文件支持的屏幕。
节点uses-permission:声明应用程序需要的权限;在安装应用程序的时候,所有权限都将告诉用户。对很多API和方法调用来说,权限都是必需的,特别是那些需要付费或者有安全问题的服务。
节点permission:应用程序组件创建权限来限制对共享应用程序组件的访问。使用permission标签来创建权限定义。
节点instrumentation:instrumentation类提供一个测试框架,用来在应用程序运行时测试应用程序组件。对于为应用程序创建的每一个测试类,都需要创建一个新的节点。
节点application:一个manifest只能包含一个application节点。该节点使用各种属性来指定应用程序的各种元数据(包括标题、图标和主题)。application节点还可以包含Activity、Service、Content Provider和Broadcast Receiver节点的容器,它包含的这些节点指定了应用程序组件。其中使用android:name属性可以指定自定义Applicatioin类的名称。
应用程序内的每一个Activity都要求有一个activity标签,并使用android:name属性来指定Activity类的名称。此时必须包含核心的启动Activity和其他所有可以显示的Activity。启动任何一个没有在Manifest中定义的Activity时都会抛出一个运行时异常。
其中service、provider、receiver这些标签和activity标签一样,都标记的是应用程序中对应的Service、Content Provider和Broadcast Receiver类。
其中uses-library用于指定该应用程序需要的共享库。可以指定特定的一个包是必需的还是可选的。指定为必需时,在缺少指定库的设备上将无法安装该应用程序。