Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1085704
  • 博文数量: 169
  • 博客积分: 12306
  • 博客等级: 上将
  • 技术积分: 1299
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-29 14:55
文章分类

全部博文(169)

文章存档

2012年(18)

2011年(78)

2010年(15)

2009年(1)

2008年(11)

2007年(39)

2006年(7)

我的朋友

分类: LINUX

2011-10-20 13:52:43

活动对象 (Activities)

一个活动对象是一个应用组织,他提供了一个与用户交互的屏幕,用户可以利用这些交互做一些事情,比如:打电话,拍照,发邮件 ,或者是看地图等。每个活动对象都占用一个窗口去画他的用户接口。窗口通常填满屏幕,但是有可能小于屏幕而是漂浮在其它窗口之上的。

一个应用通常包括多个活动对象,而这些活动对象 彼此是松散关联的。典型的,一个活动对象指定为 Main对象,当用户第一次启动这个对象的时候,他将会首先展现给用户。为了实现不同的动作,每个对象都可以启动其它对象。每次,当一个新活动对象启动了,前一个活动对象就被停止,但是系统会将其保存到一个栈中 (名叫 back stack).当一个新活动对象启动了,他被 push back stack 栈中并且占据用户的焦点。 Back stack 遵守一个后入先出的原则。所以当用户完成了当前活动,按 BACK键,当前的活动对象被弹出栈并被消毁,并且使前一个对象活动得以继续

当一个活动对象因为另一个活动对象的启动而停止了。这些状态的改变是通过活动对象生命周期的回调方法通知的。由于活动对象的状态改变,活动对象可能会接到一些回调方法。比如:系统正在创建,正在停止,正在进入 Resume状态 , 或者正在销毁。每个回调方法都给你一次机会去做相应的工作以应对状态的改变。例如,当停止了,你的活动对象应该释放较大的对象,比如网络和数据库连接。当活动 resume时,可以重新获得这些资源并继续被中断的活动。这些状态转换就是活动对象的所有生命周期。

本文余下的部分讨论如何建立和使用活动对象的基础,包括完整的讨论活动对象的生命周期如何工作,你可以合适的管理这些状态之间的转换。

创建活动对象 (Create an Activity)

要创建一个活动对象,你必须要创建一个 Activity(或者一个 Activity的子类 )的子类 .在你的子类中,你需要实现活动对象生命周期转换的回调方法 ,例如:当活动对象正被创建,停止, resumed,或者销毁。最为重要的两个回调方法是 :

onCreate()你必须实现这个方法。当系统创建你的对象的时候回调用。在你的实现里,你应该实现必要的组件。最为重要的是,这里你需要调用 setContentView()去定义你的活动对象的用户接口的布局 .

onPause()系统调用这个方法,是用户正在离开你的活动对象的第一个指示(当然你的活动对象并不一定是要被销毁)。这里通常是你保存用户会话的需要持久保存的地方(因为用户有可能不会再回来)。

这里还有一些其它的生命周期的回调方法。你应该使用这些回调给用户提供流畅的用户体验和对一些中断比如停止和销毁做出处理。所有的生命周期的回调将会稍后作出讨论。

实现一个用户接口 (Implementing a user interface)

活动对象的用户接口是由一组层次体系的视图提供的。这些视图是都是从 View类衍生出的对象。每个视图都控制一个活动对象的屏幕的特定的矩形架,并且可以对用户交互作出响应。例如,一个视图可能是一个按钮,当用户触摸到它便发起一个动作。

Android提供了一组现成的视图以供你设计和组织你的布局。 ”Widgets”是一组视图,它们为屏幕提供了一组可视的 (可交互的 ) 元素 , 例如: button, text filed, checkbox, 或者仅仅是一张图片。 ”Layouts”是一组从 ViewGroup衍生而来的视图 , 它们为他们的子视图创建了一组布局模型,例如: liner layout, grid layout, relative layout 你也可以继承 View或者 ViewGrooup 类去创造你自己的 widgets layout,并用他们来应用为你自己的活动对象的布局。

定义一个布局的较为普遍的方法是使用 XML layout 文件,这个文件保存在你的应用的资源中。这种方法,你的用户接口的设计可以从定义用户行为的源代码中独立出来维护。你可以用 setContentView()为你的活动对象设置布局 UI,为布局传递资源 ID.然而,你也可以在你的活动对象的代码中创建新的 Views并且通过插入一些 View ViewGroup建立一些层次系统 ,然后传递 ViewGroup的根给 setContentView()以供其使用。

manifest中声明活动对象 (Declaring the activity in the manifest)

为了让你的活动对象能被系统访问,你需要在 manifest中声明你的活动对象。要声明一个活动对象,打开 manifest文件,并且加入 元素作为 元素的子元素。例如:

 

  1. <manifest ... >  
  2.   <application ... >  
  3.       <activity android:name=".ExampleActivity" />  
  4.       ...  
  5.   application ... >  
  6.   ...  
  7. manifest>  


这里还有其它的一些属性你可以设置。例如标签,图标,或者 UI的主题。

使用intent filter(Using intent filters)

一个 元素也可以配置各种 intent-filter。使用 元素来实现。可以声明其它的应用组织如何来激活他。

只有一个 Activity应该有 ”main” Action ”launcher” Category。如果你只想要你的应用自己包含这个 Activity,并且不允许别个应用激活这个应用,你不需要 intent filter

然而,如果你想要你的 Activity响应用来自别的应用的 intent,你必须要为你的 Activity定义附加的 intent filter。为每一个你想要响应的 intent的类型,你必须定义一个 ,他包含一个 元素,可选的,一个 元素和或一个 元素。这些元素指定了你的 activity可以响应的 intent的类型。

启动一个Activity(Starting an Activity)

你可以通过调用 startActivity()方法来启动另一个 Activity。需要传递一个 intent去描述什么样的 Activity你想启动。 Intent可精确指你想要启动哪一个 Activity,也可以指定你想执行的 Activity的类型 (系统会为你选择适当的 Activity去执行,即使这个 Activity来自不同的应用 )。一个 Intent也可以传递一些小量数据到启动的 Activity中去。

当在你自己的应用中,你通常可以简单的启动一个已知的 Activity。你可以用类名 (你要启动的 Activity)创建 一个 intent精确的定义你要启动的 Activity。例如,一个 Activity如何启动另一个名叫 SignInActivity Activity


  1. Intent intent = new Intent(this, SignInActivity.class);  
  2. startActivity(intent);  

然而你的应用可能用你的数据执行一些动作,比如:发邮件,发 Message,或者状态更新。在这种情况下,你可能需要使用别的应用提供的 Activity。这就是 Intent的真正的价值所在,你可创建一个 intent去描述什么样的 Activity你想执行,系统会从其它应用中启动合适的 Activity。如果这里有多个 Activity可以处理这个 intent,用户可以选择一个来使用。例如:如果你想要你的用户发送邮件,你可以创建如下的 intent:


  1. Intent intent = new Intent(Intent.ACTION_SEND);  
  2. intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);  
  3. startActivity(intent);  

EXTRA_EMAIL添加了一组邮件地址,他将会出现在发邮件 Activity to栏中。这时, email应用的 Activity就启动了,当用户完成他的工作之后,又可以激活你之前的 Activity

为一个结果而启动一个 Activity( Starting an activity for a result )

有时,你可能想从你启动的 Activity中得到返回的结果。那么你需要用 startActvityForResult()来启动 Activity。当启动的这个程序结果之后,反回结果会返回到 onActvityResult()中。

 

关闭一个 Activity(Shutting Down an Activity)

你可以通过调来 finish()方法来关闭你的 Activity。你也可以用 finishActivity()来关闭一个你之间启动的 Activity

 

管理活动对象的生命周期 (Managing the Activity Lifecycle)

实现回调方法管理活动对象的生命周期是开发一个强大的稳定的应用的关键。一个活动对象的生命周期直接被他关联到的其它活动对象,他的任务,以及所属的 back stack所影响。

一个对象可以以以下三个状态存在:

Resumed:

                一个活动对象在屏幕的前台,并且拥有用户的焦点。这个状态有时也指 running.

Paused:

                另一个活动对象在屏幕前台,并且拥有用户的焦点,当时当前活动对象仍然可见。也就是说,另一个活动对象在这个活动对象上面,并且这个活动对象有一部分是透明的,没有完全占据整个屏幕。 Paused 对象是完全 alive ( Activity 仍然保留在内存中,他维护他所有状态和成员信息,并且仍然附属于 window manager) ,但是在低内存情况下为了系统为获得内存他可能被杀死。

Stopped:

活动对象被另一个活动对象完整的占领了,即是这个活动对象处于后台。一个 Stopped对象仍然是 alive (这个活动对象保留在内存中的 ,他维护所有的状态和成员信息 ,但是他不再附属于 window manager),然而,他对于用户不在可见,他可能在任何需要内存的时候被系统杀死。

如果一个 Activity stopped或者 paused的,系统可以通过 finish()或者杀死进程来释放 (drop)掉它。当 Activity被重新打开 ( finished或都 killed之后 ),它必须完全被重新创建。

 

实现生命周期的回调 ( Implementing the lifecycle callbacks )

当一个 Activity从以上描述到的一个状态到另一个状态转换,他会通过各种回调方法得以通知。所有的回调方法都是勾连的,你可以重载他们去做合适的工作以适应你的 Acitvity的状态改变。以下的 Activity骨架包括每一个基本的生命周期的方法。

  1. public class ExampleActivity extends Activity {  
  2.     @Override  
  3.     public void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         // The activity is being created.  
  6.     }  
  7.     @Override  
  8.     protected void onStart() {  
  9.         super.onStart();  
  10.         // The activity is about to become visible.  
  11.     }  
  12.     @Override  
  13.     protected void onResume() {  
  14.         super.onResume();  
  15.         // The activity has become visible (it is now "resumed").  
  16.     }  
  17.     @Override  
  18.     protected void onPause() {  
  19.         super.onPause();  
  20.         // Another activity is taking focus (this activity is about to be "paused").  
  21.     }  
  22.     @Override  
  23.     protected void onStop() {  
  24.         super.onStop();  
  25.         // The activity is no longer visible (it is now "stopped")  
  26.     }  
  27.     @Override  
  28.     protected void onDestroy() {  
  29.         super.onDestroy();  
  30.         // The activity is about to be destroyed.  
  31.     }  
  32. }  

 

总而言之,这些方法定义了 Activity的整个生命周期。通过实现这些方法,你可以监视生命周期的三个嵌套循环 :

整个生命期 (entire lifetime),在调用 onCreate() onDestroy()之间的整个生命期。你的 Activity应该在 onCreate()中执行一些全局的状态的 (如定义 layout)设置,并在 onDestory()中释放持有的资源。例如:你有一个线程一直在后台持续下载东西,那么你需要在 onCreate()中创建并在 onDestory()中停止他。

可视生命期 (visible lifetime),可视生命期是在 onStart() onStop()之间的生命期。在这段时期内用户可以在屏幕上看到我们的 Activity并且与其交互。例如:当新的 Activity启动并且当前的 Activity不在可见时调用 onStop()。在这两个方法之间,你可以维护你需要显示给用户的 Activity的资源。例如,你可以在 onStart()中注册一个广播接收器去监视那些影响到你的 UI的改变,在 onStop()中反注册这个广播接收器,这时用户已经看不到你显示的东西了。系统可能在 Activity在整个生命期中调 onStart() onStop()很多次,作为 Activity对用户的显示与隐藏的轮替。

前景期 (foreground lifetime),Activity的前景期发生在 onResume() onPasue()之间。在这期间, Activity在屏幕的最前端,并且拥有用户的输入焦点。一个 Activity可以频繁的转换在进出前景之间。例如:当设备进入休眠状态或者一个对话框跳出来以至于 onPause()被调用。由于这个状态可能会很频繁的转换,这两个方法中的代码应该尽可能轻量级避免使转换变慢以至于用户等待。

1说明了这些循环和 Activity各状态之间可能的路径。矩形代表你可以实现回调方法 ,你可以执行一些操作,执行操作时的活动状态之间的转换 。(图片地址:http://developer.android.com/reference/android/app/Activity.html)

处理配置改变 ( Handling configuration changes )

一些设备的配置可以在运行中发生改变 (比如:屏幕方向,键盘的可访问性,语言 )。当这样的改变发生了, Android重新启动正在运行的 Activity(onDestroy()调用,然后立即调用 onCreate())。重启行为的设计是为了帮你的应用去自动重载你所提供的可选资源以适应新的配置。如果你在你的应用中的这个事件设计了适当的处理,他可以较强的适应在生命周期中意想不到的事件发生。

处理配置改变 (比如屏幕方向的改变 )的最好的办法是,使用 onSaveInstanceState() onRestoreInstanceState()简单的保存你的应用程序的状态。

 

( 协调多个 Activity) Coordinating activities

当一个 Activity启动另一个 Activity,两个 Activity的生命周期都将经历。第一个 Activity暂停 (Pause)或停止 (Stop)(当然,如果第一个 Activity在后台仍然可见,他将不会停止 ),而另一个 Activity已创建了。在这两个 Activity共享磁盘数据或者其它什么地方的数据的情况下,理解第二个 Activity被创建时第一个没有完全停止是很重要的。相反,第二个 Activity的启动过程与第一个 Activity的停止过程是交替重叠的。

生命周期的回调顺序被定义好了的,特别的当两个 Activity在同一个进程中并且一个启动另一个。下面是当 Activity A启动 Activity B时这些操作发生的顺序。

1.  Activity A onPause()方法被执行。

2.  Activity B onCreate(),onStart(),onResume()方法依次执行( Activity B 拥有用户焦点)。

3.  然后,如果 Activity A不再在屏幕上可见,他的 onStop()方法执行。

你可以根据这些可预知的回调发生的顺序去管理一个 Activity到另一个之间的转换。例如:如果你的一个 Activity需要写入数据库,另一个 Activity才能读他。所以你应该在 onPause()中写入数据库而不是 onStop()中。


原文地址:http://blog.csdn.net/mshopping/article/details/6457156

阅读(1506) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~