Activity 详解(一)

activity类处于android.app包中,继承体系如下:
1.java.lang.Object
2.android.content.Context
3.android.app.ApplicationContext
4.android.app.Activity

activity是单独的,用于处理用户操作。几乎所有的activity都要和用户打交道,所以activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到activity创建的窗口上,当activity指向全屏窗口时,也可以用其他方式实现:作为漂浮窗口(通过windowIsFloating的主题集合),或者嵌入到其他的activity(使用ActivityGroup)。大部分的Activity子类都需要实现以下两个接口:

onCreate(Bundle)接口是初始化activity的地方. 在这儿通常可以调用setContentView(int)设置在资源文件中定义的UI, 使用findViewById(int) 可以获得UI中定义的窗口.
onPause()接口是使用者准备离开activity的地方,在这儿,任何的修改都应该被提交(通常用于ContentProvider保存数据).
为了能够使用Context.startActivity(),所有的activity类都必须在AndroidManifest.xml文件中定义有相关的“activity”项。

activity类是Android 应用生命周期的重要部分。

Activity生命周期
在系统中的Activity被一个Activity栈所管理。当一个新的Activity启动时,将被放置到栈顶,成为运行中的Activity,前一个Activity保留在栈中,不再放到前台,直到新的Activity退出为止。

Activity有四种本质区别的状态:

在屏幕的前台(Activity栈顶),叫做活动状态或者运行状态(active or running)
如果一个Activity失去焦点,但是依然可见(一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶),叫做暂停状态(Paused)。一个暂停状态的Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被杀掉。
如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被杀掉。
如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接杀掉它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。
下面的图显示了Activity的重要状态转换,矩形框表明Activity在状态转换之间的回调接口,开发人员可以重载实现以便执行相关代码,带有颜色的椭圆形表明Activity所处的状态。

Android <wbr>Activity类详解(一)

在上图中,Activity有三个关键的循环:

整个的生命周期,从onCreate(Bundle)开始到onDestroy()结束。Activity在onCreate()设置所有的“全局”状态,在onDestory()释放所有的资源。例如:某个Activity有一个在后台运行的线程,用于从网络下载数据,则该Activity可以在onCreate()中创建线程,在onDestory()中停止线程。
可见的生命周期,从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等,例如:可以在onStart中注册一个IntentReceiver来监听数据变化导致UI的变动,当不再需要显示时候,可以在onStop()中注销它。onStart(),onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。
前台的生命周期,从onResume()开始到onPause()结束。在这段时间里,该Activity处于所有Activity的最前面,和用户进行交互。Activity可以经常性地在resumed和paused状态之间切换,例如:当设备准备休眠时,当一个Activity处理结果被分发时,当一个新的Intent被分发时。所以在这些接口方法中的代码应该属于非常轻量级的。
Activity的整个生命周期都定义在下面的接口方法中,所有方法都可以被重载。所有的Activity都需要实现onCreate(Bundle)去初始化设置,大部分Activity需要实现onPause()去提交更改过的数据,当前大部分的Activity也需要实现onFreeze()接口,以便恢复在onCreate(Bundle)里面设置的状态。

public class Activity extends ApplicationContext {
protected void onCreate(Bundle icicle);

protected void onStart();

protected void onRestart();

protected void onResume();

protected void onFreeze(Bundle outIcicle);

protected void onPause();

protected void onStop();

protected void onDestroy();
}


Activity主要提供一个界面窗口来给用户提供特定的功能,例如打电话,照相,发送短信,看地图。每一个Activity被提供一个窗口来画整个用户界面。一般,这个窗口填充整个屏幕,但也可能比屏幕小并且悬浮在其它窗口上。

    一个应用程序通常包括多个松耦合的Activity。通常,有一个Activity被标示为一个主Activity,当程序第一次加载时,显示给用户。每一个Activity可以启动其它的Activity来实现其它功能。每当一个Activity启动,前一个Activity就停止下来,但系统把这些Activity保存在一个栈(返回栈)中。每当一个新的Activity启动时,它就被压到这个栈中,并且得到用户焦点。这个栈根据基本的先入后出的原则管理这些Activity。所以,当用户处理完当前Activity中的事务并按下了返回键时,这个Activity就被从栈中反弹出来(并且被销毁),前一个Activity就被重新恢复。

    当一个Activity由于另一个Activity启动而被停止时,通过Activity本身的生命周期回调函数可以告知它自己这个状态改变事件。一个Activity可以收到几种这样的和它的状态更改有关的生命周期回调函数。例如系统是否正创建它,停止它,重新恢复它,或者销毁它。每一个生命周期回调函数都提供一种机制,来使你根据Activity的状态改变做适当的事情。例如,当一个Activity停止时,你的Activity应该释放像网络连接或数据库连接这样的大的对象。当一个Activity重新恢复时,你可以请求必要的资源并恢复到打断前的状态。这些Activity的状态转变组成了整个Activity的生命周期。

    接下来讨论一些关于怎样创建和使用一个Activity的基础知识,包括关于Activity生命周期怎样发生作用的完整详细的讨论,这样你就能正确地管理Activity在多种状态之间的转变。

1. 创建一个Activity

    为了创建一个Activity,你必须创建一个Activity类的直接或间接的子类。在你创建的这个子类中,你必须实现一些生命周期回调函数,当Activity在这些生命状态之间转换时,系统会调用这些回调函数。例如,当一个Activity被创建时,停止时,重新恢复时,或被销毁时。最重要的两个生命周期回调函数是:

    A.onCreate()

        你必须实现这个生命周期回调函数。系统在创建这个Activity时调用它。在你的实现方法中,你应该初始化对你的Activity来说必需的组件。最重要的是,在这个回调函数中,你必须调用setContentView()来定义这个Activity的关于用户界面的基本布局。

    B.onPause()

        系统调用这个方法作为用户离开ctivity的第一个指示,虽然这并不总是意味着这个Activity将要被销毁。在这个方法里,你应该将那些应该保存下来的更改持久化,因为用户可能不不会再返回到这个Activity。

        还有别的生命周期回调函数。如果你想给用户提供流畅的用户体验和处理那些可能引起你Acitivity被停止甚至被销毁的突然的中断,你就应该好好利用这些生命周期函数。所有的生命周期函数将在下面的 管理Activity 章节讨论。

 

2. 实现一个用户界面

   Activity的用户界面由一个具有层次结构的Views组成。每一个View控制一个特定的能和用户交互的矩形区域。例如,一个View可能是一个按钮,当用户触摸它时,触发一个动作。

    Android提供了一些已实现好的View,利用这些View,你可以设计和组织你的用户界面的布局。Widgets是一些可视化、可交互的View,像按钮、文本框、多选框、或者仅仅是一个图片。Layouts是一些特殊的View,继承自ViewGroup,它们的功能是为子View提供一个独一无二的布局模型,例如linearlayout线性布局,grid layout, relative layout。你也可以继承View和ViewGroup(或者它们的子类),来创造你自己的Widgets和layouts,并且你可以把它们用到你的Activity中。

    经常使用资源中的XML格式的布局文件来定义用户界面布局。通过这个方法,你可以把用户界面布局和Activity的逻辑处理代码分开。通过传递一个layout的资源ID给setContentView(),你可以把一个layout设置为Activity的用户界面。当然,你也可以用代码直接新建一个具有层次结构的Views(实现方法为把View插入到ViewGroup中),然后把根ViewGroup传递给setContentView()实现用户界面布局。

    想要了解更多关于用户界面的信息,你可以参考 用户界面 那章。

3. 在manifest(清单)文件中声明Activity

    你必须在manifest文件中声明你的Activity,以便系统能取得它们。通过在manifest文件中的<application>中添加<activity>元素,你可以声明你的Activity。例如:

<manifest ... >

  <application ... >

      <activity android:name=".ExampleActivity" />

      ...

  </application ... >

  ...

</manifest >

Activity还有别的属性你可以定义在这个元素中,像Activity的标签,图标,或者是一个关于这个Activity的风格主题。你可以查询<activity>,来得到更多的关于它可用的属性的相关信息。

 

4. 使用intent filters(意图滤镜)

 


原文地址:http://blog.csdn.net/liyongjin2009/article/details/6378330

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值