activity 生命周期详解

来源:互联网 发布:中东路事件 知乎 编辑:程序博客网 时间:2024/06/07 05:21

启动一个Activity - Starting an Activity


原文地址:http://developer.android.com/intl/zh-CN/training/basics/activity-lifecycle/starting.html

与其他在应用程序中由main()函数作为开端不同,Android系统的启动代码是在一个Activity的实例通过调用对应其生命周期的特定阶段的特定回调方法中进行。其中有一系列的方法来启动Activity,也有一系列的方法来注销一个Activity。
这次的教学内容,将会描述生命周期中最重要的函数方法,并向你展示如何在创建你的Activity实例时处理首要生命周期回调函数。

了解生命周期回调函数


在Activity的整个生命中,系统按顺序地调用一系列的像金字塔般的生命周期函数。也就是说,每个阶段的活动是金字塔中单独的一个步骤。当系统创建了一个新的Activity实例,每调用一个函数,就会往金字塔顶端走一步。而金字塔最顶端的状态(Resumed状态)就是Activity正在前台运行而且用户正与其交互的状态。
当用户开始离开Activity,系统就会调用其他的方法,使Activity的状态往金字塔的低端走,并逐步去除Activity。在某些条件下,Activity只会往低端走一小步并在该处等待(例如用户转去了其他应用程序),而在该处Activity也可以重新回到顶端(当用户返回到原Activity)并恢复到原来的状态。

图1:Activity生命周期的简化图,就像一个阶梯金字塔。这图像表明每个状态中是怎么样使用回调函数使得恢复状态回到顶端,或者降低状态到达底部。Activity可以从Paused状态和stopped状态恢复到Resumed状态。
根据你的Activity的复杂程度,你可能不需要使用全部的生命周期函数。然而,去认识每一个周期函数并使用它们去保证满足用户的期望是非常重要的。正确使用你的Activity生命周期函数去保障应用程序的良好表现,必须注意很多方面,包括下面的内容:

  • 当用户接听电话或者转去另外一个应用程序时,不要让程序崩溃。
  • 当用户没有激活使用它时,不消耗宝贵的系统资源。
  • 当用户离开你的应用程序并在稍后的时间返回,不会丢失用户的进度。
  • 当用户屏幕在横向与纵向旋转切换时,不会崩溃或者丢失用户进度。

    你将会在下一课中学到,在很多种情况下,activity都会经历 图1中所示的各种不同状态的转变。然而,这其中只有3种状态是静态的。这意味着,activity 只能在这3种状态之一中存在一段时间:
    Resumed状态

  • 在这种状态下,该Activity在前台运行,用户可以与它进行交互。(有时也简称为“running”状态。)

Paused状态

  • 在这种状态下,该Activity被部分遮蔽(被其他在前台的半透明或不覆盖整个屏幕的活动遮住)。此状态不接受用户输入,并且不能执行任何代码。

Stopped状态

  • 在这种状态下,该活动是完全隐藏,不可见的,可视为存在于后台。虽然停止,活动实例和所有成员变量如状态信息将被保留,但不能执行任何代码。

其他的状态(**created状态**和**started状态**)都是非常短暂而且系统通过调用函数使得非常快地转到下一状态。换句话说,当系统调用了onCreated()之后,非常快地就调用了onStart()方法使得进入下一状态,而又马上调用了onResumed又进入了下一状态。

上面是基本生命周期知识。下面,您开始学习一些具体的生命周期行为。

指定应用的 Launcher Activity


当用户从主屏幕点击应用程序图标,系统会调用你声明的Launcher或者主Activity的onCreate()函数,这是作为您的应用程序界面的主要切入点的Activity。
你可以在Androidmanifest.xml文件中定义程序的主Activity,该文件在您的项目的根目录下。

主Activity必须在manifest文件中使用标签,并包含MAIN action和LAUNCHER 内容。
例如:

123456
    <activity android:name=".MainActivity" android:label="@string/app_name">    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity>

注: 当你创建一个新的Android项目,默认的项目会包含一个Activity类,并且此类会有如上的声明。

如果任何一个activity声明都不包含android.intent.action.MAINandroid.intent.category.LAUNCHER,那么您的应用程序的图标就不会出现在android的app列表上了。
.

创建一个新实例


大多数的应用程序都会有若干个不同的Activity去让用户实现不同的操作。不管是当用户点击应用程序图标创建的主Activity,还是app响应用户的操作所产生的不同的Activity,系统都会调用onCreate()方法来创建一个新的Activity的实例。

你必须在onCreate()方法中操作一些在整个生命周期内只会调用一次的程序启动逻辑内容。例如,可以在onCreate()方法中定义用户界面的或者初始化一些类变量的内容。

例如,以下的代码向你展示在onCreate()方法中执行活动的一些基本设置,如声明用户界面(在XML布局文件中定义),定义成员变量,并配置UI。

 1 2 3 4 5 6 7 8 9101112131415161718192021
    TextView mTextView; // 定义layout中的 text view 的成员变量    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);//为Activity设置用户界面//layout 文件定义在工程的res/layout/main_activity.xml 文件中        setContentView(R.layout.main_activity);    //初始化成员变量TextView 以便之后我们可以操作它        mTextView = (TextView) findViewById(R.id.text_message);    //确保程序运行在Honeycomb 或更高版本上以使用ActionBar APIs        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {   //在主activity中,确保action bar中的app图标别实现按钮行为            ActionBar actionBar = getActionBar();            actionBar.setHomeButtonEnabled(false);        }    }

注意:在Android2.0(API 5 Level)或者更高版本中,可以使用SDK_INT阻止旧的操作系统执行新的API函数,更早版本将会遇到“运行时异常”的错误。

一旦onCreate()方法执行完毕,系统会迅速地执行onStart()方法和onResume()方法。您的Activity永远不会停留在Created或者Started状态中。当onStart()方法被调用之后,Activity将会变成可见,但是onResume()方法会迅速被调用,并且Activity会维持在Resumed状态直到一些事情发生,例如接到电话,或者用户导航到另一个Activity中,或者屏幕被关闭了。

在后续的其他内容中,你会学习到其他的启动函数( onStart() 和 onResume())在从Paused或者Stoped状态中恢复您的Activity的妙用之处。

注:onCreate()方法包含一个参数:savedInstanceState,这将会在后面重建Activity的内容中讲到。

图2:这是描述Activity生命周期结构的另外一个例子,着重强调三个主要的回调函数在创建一个实例中的调用顺序:onCreate(),onStart(),onResume()。一旦这个调用顺序完成了,Activity将会到达用户可以交互的Resumed状态直到用户选择去了其他Activity。

销毁Activity


Activity的第一个生命周期函数是onCreated,最后一个生命周期函数是onDestroy()。系统将调用onDestroy()函数作为Activity从内存中完全销毁去除的最后一个信号。
大多数的应用程序并不需要实现这个函数,因为局部类的引用将会和Activity一起销毁,而一些清理工作,主要也是在onPaused()和onStop()中。然而,如果你的Activity包含了有在onCreated()或者其他持续性运行的资源在后台线程运行,您就应该在onDestroy()方法中清除掉它们,而避免内存泄露。

1234567
    @Override    public void onDestroy() {        super.onDestroy();  // Always call the superclass        // Stop method tracing that the activity started during onCreate()        android.os.Debug.stopMethodTracing();    }

注意 :一般来说,系统会在调用onPause()方法和onStop()之后才调用onDestory()方法,但是,有一种情况是例外的,那就是在你在onCreate()方法中调用finish()方法。在一些情况下,你的Activity作为一个临时决定的操作对象而去启动另外一个Activity时,你可能需要在onCreate()方法中调用finish()方法去销毁Activity,在这种情况中,系统会直接调用onDestroy()方法而不用再去调用其他的生命周期函数