Android系统的应用程序与Java程序不同,没有程序入口点main()方法,整个程序由多个组件构成,每个组件可以调用相互独立的其他组件。根据功能的不同,Android系统提供了四类核心组件,即活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver)和数据提供者(ContentProvider),各个组件之间的数据传递通过Intent实现。
Activity(活动)是Android应用程序核心组件中最常用的一种,是用户和应用程序交互的窗口。一个Android应用程序可能含有一个或多个Activity,一个Activity通常对应一个独立的视图(页面)。这些Activity页面,用于展示信息,实现与用户的交互,并且可以相互跳转,数据可以在跳转和返回操作中传递。所有的Activity都必须在应用程序清单文件AndroidManifest.xml中注册,一个应用程序只能有一个Activity作为默认页面,当程序启动时首先展示出来。
在Activity的生命周期中,每个状态的变化都会触发相应的回调方法。开发者在创建Activity时,可以重写这些方法,填入自己的业务代码,实现特殊的功能。本章3.2节将详细学习Activity组件的理论知识和应用技术。
Service(服务)是一种特殊的程序组件,它没有用户界面,不直接与用户交互,但可以在后台稳定地运行,相当于Windows操作系统中的一个服务。Android的Service有两种类型:一种是本地服务,即本应用程序中创建的服务;另一种是远程服务,即本机中其他应用提供的服务。用户一般通过Activity来启动、控制、停止Service,手机中的音乐播放器、网络收音机等应用都是Service的典型应用。本教程第6章将详细讲解服务的理论和应用技术。
BroadcastReceiver是Android系统广播机制的一部分,它主要用于定义广播接收器。广播机制是Android系统特有的一种消息传递机制,当应用程序中特定事情发生时,可以产生相应的广播,BroadcastReceiver就是用于接收广播消息的专门组件。Android广播机制采用的是观察者模式,所有的接收器都必须在清单文件中注册,才可以接收消息,并触发相应操作。广播接收器注册的方式有两种:一种是静态注册,就是在AndroidManifest.xml文件中注册;另一种就是动态注册,在程序中完成,并在程序结束后取消注册。
Android应用中可以使用Intent.sendBroadcast()方法发送广播,系统中预设了一些广播,如开机广播、网络连通广播等。本教程的第7章将详细讲解广播机制及广播接收器的理论和应用技术。
在Android系统中,文件、数据库等数据一般是私有的,其他程序将无法直接访问,这就为应用程序之间的数据共享、相互协作造成了困难。为了解决这个问题,Android系统提供了一种全新的数据共享模式,如果一个应用需要对外共享数据,它可以发布一个ContentProvider和资源URI,提供统一的数据访问接口。任何应用都可以通过URI,使用ContentResovler实现数据访问或操作。实际上,Android的很多系统数据都是通过ContentProvider实现对外共享的,比如通信录、通话记录等。本教程第8章的8.3节将详细介绍数据提供者的基础知识和使用技术。
Intent的中文意思是“意图,意向”,Android平台中使用Intent组件实现应用间的交互与通信。Intent对应用中一次操作的动作、数据进行描述,Android则根据Intent的描述找到对应的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部组件的交互,如图3-1所示。因此,可以将Intent理解为不同组件之间通信的“媒介”,专门提供组件互相调用的相关信息。
图3-1 应用程序内部的Intent作用图
Intent对象大致包括7个属性:Action(动作)、Data(数据)、Category(类别)、Type(数据类型)、Component(组件)、Extra(扩展信息)、Flag(标志位)。其中最常用的是Action属性和Data属性。在Intent实现应用程序内部、应用程序之间的组件通信时,这些属性分别发挥不同的作用。
下面介绍Intent常用的功能。
1)显示启动Activity
显示启动Activity是指在一个Activity中启动另一个Activity,此功能使用简单,应用广泛,具体用法参见3.2节Activity的理论和应用技术。
2)隐式启动Activity
隐式启动Activity是指在一个Activity中启动另一个未知的Activity,它主要用于不同应用程序之间的相互调用。被隐式调用的Activity需要在应用程序中注册Activity的节点下定义<intent-filter>子节点,即Intent过滤器,这样其他应用程序中的调用者就可以使用Intent的隐式启动方式调用该Activity了。
假如在一个应用程序firstProject中已经设计并实现了一个Activity,类名为FirstActivity,在AndroidManifest.xml文件中注册并添加<intent-filter>的代码如下:
以上Intent过滤器注册代码中指定了Intent的action、category、data属性,其中action、categoery属性采用Android提供的预定义常量,开发者可以查阅相关文档;data属性的scheme和host可由开发者自定义。
假如在另一个应用程序secondProject的IntentCallActivity中启动firstProject应用程序中的FirstActivity,使用Intent的参考代码如下:
关于Intent过滤器的另一个重要用途为配置一个应用启动时的默认页面,方法为在清单文件中主页面的Activity配置节点下添加<intent-filter>子节点,其action和category均采用固定值,参考代码如下:
事实上,Android系统中有大量的允许其他应用程序调用的Activity,它们都定义了Intent过滤器,开发者可以使用Intent隐式启动方式来调用它们,常见的有以下程序。
· 电话拨号应用程序。
· 短信发送应用程序。
· 网页浏览应用程序。
· 邮件发送应用程序。
· 图片库调用应用程序。
以电话拨号应用程序为例,使用方法如下:
3)启动服务
启动服务也是Intent的一个重要功能,有以下两种启动方式。
· 普通方式,通过Context.startService(Intent intent)来实现。
· 绑定方式,通过Context.bindService(Intent i, ServiceConnection c, int f)来实现。
这两种启动服务的方式具体的应用将在第6章详细讲解。
4)发送广播
使用Intent发送广播的方法非常简单,主要是调用Context的sendBroadcast()方法,参考代码如下: