安卓开发之基本构件

1、Activity

  一个Activity,通常是用户在某一个时刻,在设备上看到的单独的界面。一个应用程序通常含有多个Activity,用户可在期间进行切换。对用户而言,这就是程序的外观部分。

  Activity的生命周期:启动一个Activity可能会消耗大量资源。他可能会涉及到新建一个Linux进程、为UI对象申请内存空间、从UML布局填充所有对象,以及创建整个界面。为了避免这种浪费,Android通过ActivityManager来管理活动的生命周期。

  ActivityManager负责创建、销毁、管理Activity。

  在Android编程与在其他环境中编程有些区别。在Android中你会发现更多的是对应用程序的状态改变做出响应,而很少主动改变它的状态。Android是一个被外部控制和管理起来的环境,与在Javaapplet和servleet中编程有些相似。因此谈及Activity的生命周期我们很少会说他的当前状态,更多的是说状态转换过程。

  (1)启动状态:onCreate()、onStart()、onResume()

  当一个活动(Activity)还不存在与内存中时,我们称其为启动(Starting)状态。当它启动时,活动会调用一整系列由开发人员有机会指定的回调函数。最后活动(Activity)hi进入运行状态(running)。

  注意,从启动状态到运行状态的转换时最耗时的操作之一。耗时就是耗电,对电池的续航能力也有直接的影响。因此不再显示的活动不会被轻易的销毁,而是使它驻留在内存中,这样用户下次访问的时候可以节省资源。

  (2)运行状态

  处于运行状态的活动,是指当前显示在屏幕上与用户交互的活动。我们也称该活动获得了焦点(in foucs),意味着所有用户交互——例如打字,触摸屏幕,单击按钮——都由这个活动处理。由此可知同一时刻只能有一个活动处于运行状态。

  正在运行的活动可以优先获取它所需内存或资源,以便尽量以最快的速度运行。

  (3)暂停状态

  当活动没有获得焦点(例如没有与用户交互),但仍显示在屏幕上时,它就处于暂停状态(paused)。

  活动会在停止前进入暂停状态。暂停状态的活动依然拥有获取内存或者其他资源的优先权。因为他们依然显示在屏幕上,应该尽量避免使用户感到不自然。

  (4)停止状态

  当一个活动不再显示却依然驻留在内存中的时候,我们称其为停止状态(stopped)。停止状态的活动可以再次显示,成为一个运行状态,也有可能被销毁并从内存中移除。

  系统会将处于停滞状态的活动保留一段时间,因为用户很可能稍后希望在返回到这些活动,并且重新启动一个停止的活动远比初始化一个新的活动代价要小。

  停止状态的活动可能随时被从内存中移除。

  (5)销毁状态

  销毁(destroyed)状态不在驻留在内存中。当活动管理器认为不在需要某个活动的时候机会移除它。在活动被销毁之前,他可以做一些特定的操作,比如保存信息。但是Android并不保证你的活动在销毁前会先被停止,暂停的活动也一样可能内销毁。因此,最好在切换回暂停状态时执行重要的工作。

  实际上,运行中的状态并不意味着他正在进行频繁的运算,他可能只是在那里等待用户的输入。相似的处于停止状态的活动也不一定什么都不做。状态名称主要是指活动对于用户输入的响应程度,换句话说即一个活动是否课件,获得焦点,或者根本不可见。

2、Intent

  Intent是指在主要构件之间传递的消息。它能够触发并启动一个消息,告诉一个服务启动还是停止,或者只是简单地广播。Intent是异步的,这意味着发动它们的代码不必等待它们完成并返回。

  Intent分为显式的(expicit)和隐式的(implicit)两种。在显式的Intent中,发送者需要明确的指定接收Intent的组件。在隐式的Intent中,发送者只需指定接收者的类型。

3、服务(Service)

  服务运行于后台,没有任何用户界面。它们可以喝活动一样执行相同的操作,但是没有任何用户界面。服务用于不管界面上有什么,我们都希望可以执行一段时间的操作。例如:你可能希望在其它应用程序之间切换时,音乐播放器依然可以播放歌曲。

  服务的生命周期比活动要简单地多。你可以启动或停止一个服务,同样的服务的生命周期或多或少的由开发人员控制,受系统控制相对较少。

  虽然服务运行于后台,但这并不是说它在另一个独立的线程上运行。而如果一个服务正在执行一段耗时的操作,你通常需要将它放在单独的线程上处理,否则将影响你的用户界面的响应速度。简单地说,服务和活动运行在同一个主应用程序线程中,这个线程也被称为UI线程。

  注意:不要将Android的服务(这些都是Android英语程序的一部分)和Linux的原生服务、服务器进程或者守护进程相混淆(它们都是操作系统更底层的组件)。

4、内容提供器(ContentProvider)

  内容提供器是应用程序之间共享数据的接口。Android默认每个应用程序都运行在自己的沙盒中,这样该应用程序的所有数据与系统中其它程序的数据就完全隔离了。虽然少量的数据可以通过Intent在不同的应用程序之间传递,内容提供器则用于大数据集之间的共享持久数据。为此内容提供器提供了一一套很好的复合DRUD(Creat、Read、Update、Delete)原则。

  内容提供器的接口相对比较简单,就是标准的insert()、update()、delete()、qurey()方法。这些方法看上去很像标准的数据库方法,因此为数据库实现一个内容提供器作为代理业相对简单。我们应该尽可能的使用内容提供器而不是自己去实现。

5、广播接收器(BroadcastReceiver)

  广播接收器是Android在系统级别对“发布——订阅”机制,或者说观察者模式(Observer)的实现。接收器一般只是等待,直到其订阅的事件发生时,才被激活。

  系统自身时时都在进行着广播。例如收到一条短信,接一个电话等的呢。所有这些事件都被广播,而且它们可以出发任意数量的接收器。

  可以向应用程序的不同部分发送广播,或者其他完全不同的应用程序发送广播。

  广播本身没有任何可视化的展现,也不会在内存中主动进行。但是一旦被触发,它们可能执行某些代码,例如启动一个活动,服务或其他。

6、应用程序上下文(ApplicationContext)

  应用程序上下文是应用程序环境及其所有组件运行所在的进程。它允许应用程序在不同的构件中共享数据和资源。

  不管应用程序中首先启动的是活动、服务还是其它构件,都会先创建应用陈新股上下文。只要你的应用程序没有消亡,应用程序上下文也会一直存活。正因为如此,应用程序上下文与生命周期无关。你可以通过Context.getApplicationContext()或Activity.GetApplication()来获得对上下文的引用。

  注意,Activity和service都是上下文的子类,因此他们也就继承了上下文的所有方法。