Android 开发指南(一)- 关键类简要描述

本文介绍了Android应用程序的基本架构,包括四大核心组件:Activity、Service、BroadcastReceiver和ContentProvider的功能及使用方式,以及Intent如何用于组件间通信。

关键类:

 

1.Activity

2.Service

3.BroadcastReceiver

4.ContentProvider

5.Intent

 

Android 应用程序使用 Java 做为开发语言。aapt 工具把编译后的 Java 代码连同其它应用程序需要的数据和资源文件一起打包到一个 Android 包文件中,这个文件使用 .apk 做为扩展名,它是分发应用程序并安装到移动设备的媒介,用户只需下载并安装此文件到他们的设备。单一 .apk 文件中的所有代码被认为是一个应用程序。

 

从很多方面来看,每个 Android 应用程序都存在于它自己的世界之中:

  • 默认情况下,每个应用程序均运行于它自己的 Linux 进程中。当应用程序中的任意代码开始执行时,Android 启动一个进程,而当不再需要此进程而其它应用程序又需要系统资源时,则关闭这个进程。
  • 每个进程都运行于自己的 Java 虚拟机(VM)中。所以应用程序代码实际上与其它应用程序的代码是隔绝的。
  • 默认情况下,每个应用程序均被赋予一个唯一的 Linux 用户 ID,并加以权限设置,使得应用程序的文件仅对这个用户、这个应用程序可见。当然,也有其它的方法使得这些文件同样能为别的应用程序所访问。

使两个应用程序共有同一个用户 ID 是可行的,这种情况下他们可以看到彼此的文件。从系统资源维护的角度来看,拥有同一个 ID 的应用程序也将在运行时使用同一个 Linux 进程,以及同一个虚拟机。

Android 的核心功能之一就是一个应用程序可以使用其它应用程序的元素(如果那个应用程序允许的话)。比如说,如果你的应用程序需要一个图片卷动列表,而另一个应用程序已经开发了一个合用的而又允许别人使用的话,你可以直接调用那个卷动列表来完成工作,而不用自己再开发一个。你的应用程序并没有吸纳或链接其它应用程序的代码,它只是在有需求的时候启动了其它应用程序的那个功能部分。

为达到这个目的,系统必须在一个应用程序的一部分被需要时启动这个应用程序,并将那个部分的 Java 对象实例化。与在其它系统上的应用程序不同,Android 应用程序没有为应用准备一个单独的程序入口(比如说,没有 main() 方法), 而是为系统依照需求实例化提供了基本的组件。共有四种组件类型:


一、Activity

Activity是为用户操作而展示的可视化用户界面。比如说,一个activity可以展示一个菜单项列表供用户选择,或者显示一些包含说明的照片。一个短消息应用程序可以包括一个用于显示做为发送对象的联系人的列表的activity,一个给选定的联系人写短信的activity以及翻阅以前的短信和改变设置的activity。尽管它们一起组成了一个内聚的用户界面,但其中每个activity都与其它的保持独立。每个都是以Activity类为基类的子类实现。

一个应用程序可以只有一个activity,或者,如刚才提到的短信应用程序那样,包含很多个。每个activity的作用,以及其数目,自然取决于应用程序及其设计。一般情况下,总有一个应用程序被标记为用户在应用程序启动的时候第一个看到的。从一个activity转向另一个的方式是靠当前的activity启动下一个。

每个activity都被给予一个默认的窗口以进行绘制。一般情况下,这个窗口是满屏的,但它也可以是一个小的位于其它窗口之上的浮动窗口。一个activity也可以使用超过一个的窗口──比如,在activity运行过程中弹出的一个供用户反应的小对话框,或是当用户选择了屏幕上特定项目后显示的必要信息。

 

窗口显示的可视内容是由一系列视图构成的,这些视图均继承自 View 基类。每个视图均控制着窗口中一块特定的矩形空间。父级视图包含并组织它子视图的布局。叶节点视图(位于视图层次最底端)在它们控制的矩形中进行绘制,并对用户对其直接操作做出响应。所以,视图是activity与用户进行交互的界面。

比如说,视图可以显示一个小图片,并在用户指点它的时候产生动作。Android有很多既定的视图供用户直接使用,包括按钮、文本域、卷轴、菜单项、复选框等等。

 

视图层次是由 Activity.setContentView() 方法放入activity的窗口之中的。上下文视图是位于视图层次根位置的视图对象。

 

二、

服务

 

服务没有可视化的用户界面,而是在一段时间内在后台运行。比如说,一个服务可以在用户做其它事情的时候在后台播放背景音乐、从网络上获取一些数据或者计算一些东西并提供给需要这个运算结果的activity使用。每个服务都继承自 Service 基类。

一个媒体播放器播放播放列表中的曲目是一个不错的例子。播放器应用程序可能有一个或多个 activity 来给用户选择歌曲并进行播放。然而,音乐播放这个任务本身不应该为任何 activity 所处理,因为用户期望在他们离开播放器应用程序而开始做别的事情时,音乐仍在继续播放。为达到这个目的,媒体播放器 activity 应该启用一个运行于后台的服务。而系统将在这个 activity 不再显示于屏幕之后,仍维持音乐播放服务的运行。

你可以连接至(绑定)一个正在运行的服务(如果服务没有运行,则启动之)。连接之后,你可以通过那个服务暴露出来的接口与服务进行通讯。对于音乐服务来说,这个接口可以允许用户暂停、回退、停止以及重新开始播放。

 

如同 activity 和其它组件一样,服务运行于应用程序进程的主线程内。所以它不会对其它组件或用户界面有任何干扰,它们一般会派生一个新线程来进行一些耗时任务(比如音乐回放)。


三、广播接收器

广播接收器 是一个专注于接收广播通知信息,并做出对应处理的组件很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。

应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自 BroadcastReceiver 基类。
广播接收器没有用户界面。然而,它们可以启动一个 activity 来响应它们收到的信息,或者用 NotificationManager 来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。


四、内容提供者

内容提供者 将一些特定的应用程序数据供给其它应用程序使用。数据可以存储于文件系统、SQLite 数据库或其它方式。内容提供者继承于 ContentProvider 基类,为其它应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个 ContentResolver 对象,调用它的方法作为替代。ContentResolver 可以与任意内容提供者进行会话,与其合作来对所有相关交互通讯进行管理。

 

每当出现一个需要被特定组件处理的请求时,Android 会确保那个组件的应用程序进程处于运行状态,或在必要的时候启动它。并确保那个相应组件的实例的存在,必要时会创建那个实例。

 

五、激活组件 Intent

当接收到 ContentResolver 发出的请求后,内容提供者被激活。而其它三种组件 ── activity、服务和广播接收器被一种叫做 intent 的异步消息所激活。intent 是一个保存着消息内容的 Intent 对象。对于activity 和服务来说,它指明了请求的操作名称以及作为操作对象的数据的 URI 和其它一些信息。比如说,它可以承载对一个 activity 的请求,让它为用户显示一张图片,或者让用户编辑一些文本。而对于广播接收器而言,Intent 对象指明了声明的行为。比如,它可以对所有感兴趣的对象声明照相按钮被按下。

对于每种组件来说,激活的方法是不同的:

  • 通过传递一个Intent对象至 Context.startActivity() 或 Activity.startActivityForResult() 以载入(或指定新工作给)一个 activity。相应的activity可以通过调用 getIntent() 方法来查看激活它的intentAndroid通过调用 activity 的 onNewIntent() 方法来传递给它继发的intent
    一个 activity 经常启动了下一个。如果它期望它所启动的那个 activity 返回一个结果,它会以调用 startActivityForResult() 来取代 startActivity()比如说,如果它启动了另外一个 activity 以使用户挑选一张照片,它也许想知道哪张照片被选中了。结果将会被封装在一个 Intent 对象中,并传递给发出调用的 activity 的 onActivityResult() 方法。
  • 通过传递一个 Intent 对象至 Context.startService() 将启动一个服务(或给予正在运行的服务以一个新的指令)。Android 调用服务的 onStart() 方法并将 Intent 对象传递给它。
    与此类似,一个 Intent 可以被调用组件传递给 Context.bindService() 以获取一个正在运行的目标服务的连接。这个服务会经由 onBind() 方法的调用获取这个 Intent 对象(如果服务尚未启动,bindService() 会先启动它)。比如说,一个 activity 可以连接至前述的音乐回放服务,并提供给用户一个可操作的(用户界面)以对回放进行控制。这个 activity 可以调用 bindService() 来建立连接,然后调用服务中定义的对象来影响回放。
  • 应用程序可以凭借将 Intent 对象传递给 Context.sendBroadcast()Context.sendOrderedBroadcast() 以及 Context.sendStickyBroadcast() 和其它类似方法来产生一个广播。Android 会调用所有对此广播有兴趣的广播接收器的 onReceive() 方法,将 intent 传递给它们。

 

内容提供者仅在响应 ContentResolver 提出请求的时候激活。而一个广播接收器仅在响应广播信息的时候激活。所以,没有必要去显式的关闭这些组件。

而 activity 则不同,它提供了用户界面,并与用户进行会话。所以只要会话依然持续,哪怕对话过程暂时停顿,它都会一直保持激活状态。与此相似,服务也会在很长一段时间内保持运行。所以 Android 为关闭 activity 和服务提供了一系列的方法。

  • 可以通过调用它的 finish() 方法来关闭一个 activity。一个 activity 可以通过调用另外一个 activity(它用 startActivityForResult() 启动的)的 finishActivity() 方法来关闭它。
  • 服务可以通过调用它的 stopSelf() 方法来停止,或者调用 Context.stopService()

系统也会在组件不再被使用的时候或者 Android 需要为活动组件声明更多内存的时候关闭它。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值