现在的位置: 首页 > 综合 > 正文

深入理解Activity的生命周期

2013年12月09日 ⁄ 综合 ⁄ 共 4897字 ⁄ 字号 评论关闭

管理你的Activity的生命周期

当用户在系统与你的应用之间切换的过程中,你的应用中的Activity实例也会在自己的不同生命周期中切换。例如,用户第一次打开你的应用,应用展现在用户的手机桌面,获取用户的输入焦点。在这个过程中,Android系统调用了你的Activity中的一系列的生命周期方法,这些方法建立了应用组建和用户之间的联系。如果用户启动了应用中的另外一个Activity,或者直接切换到另外一个应用,系统也调用了Activity生命周期中的一系列方法使应用可以在后台运行。,

在Activity生命周期的回调方法中你可以定义Activity在用户第一次进入和重新进入应用的行为。举例来说,当你做一个流媒体播放器,你可以在用户切换到另外一个应用的时候暂停视频并停止网络连接,当用户切换回来的时候,重新连接网络,并且从用户之前暂停的点继续播放。

理解生命周期中回调方法


在Activity生命周期之中,系统调用了App生命周期中的回调方法集,这些生命周期回调方法就像一个一级一级的金字塔。Activity生命周期的每一个阶段都对应金字塔的一个台阶。当系统创建了一个新的Activity实例,回调方法一级一级的从塔底向塔顶移动,当位于金字塔顶部的时候,这个Activity就位于用户前台,用户此时就可以与Activity互动了。

当用户要离开Activity的时候,系统调用另外一串方法,使Activity的状态从塔顶移动到塔底。在有些情况下,Activity只是完成部分的状态迁移并且等待用户的指令,并重新回到塔顶的状态。

根据Activity复杂度的不同,你或许不用实现所有的生命周期方法。可是,理解每个生命周期回调函数的意义从而确保你的应用按照用户的期望正确的动作则非常重要。正确的实现生命周期的回调方法,从而使应用正确的动作,主要有以下几点需要注意:

  • 确保应用在用户使用你的时候可以接电话或者切换到其他应用而不崩溃。
  • 确保你的应用在用户不使用的时候不消耗系统资源。
  • 确保用户在从其他的应用切换回你的应用的时候能够继续之前的工作
  • 在用户屏幕切换或者其他动作的时候不崩溃或者丢失用户数据

图一所显示的Activity不同状态之间的迁移的几种情形,可是在这些状态当中只有三种是稳定的状态,所谓稳定就是Activity可以在这个状态持续保持一段时间,者三个状态是:

  • Resumed:这个状态下,Activity来到用户前台,并且完成与用户的交互。(有些情况下我们也称这个状态为运行态。)
  • Paused:在这个状态下,Activity被另外一个在前台运行的半透明的Activity或者被另外一个Activity部分盖住,在这个状态下Activity不能接受用户的输入,也不能执行任何代码 。
  • Stopped:在这个状态下,Activity被全部盖住,对用户完全不可见,可以认为已经在后台了。在停止状态下,Activity的所有实例,以及他的所有状态信息都被保存,可是不能执行任何代码。

另外的状态(Created和Started)是一个过渡状态,系统将迅速通过呼叫生命周期的回调函数来迁移到其生命周期的下一站。系统在呼叫了onCreate()->onStart()->onResume()

指定你的应用的启动Activity


当用户启动你的应用程序的时候系统调用了那个你声明为启动Activity的onCreat()方法。这个Activity作为你的应用主进入点

你可以通过修改AndroidManifest.xml这个位于你的工程根目录的文件来实现这一点。

以下为一个示例:

<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 SDK建立一个工程的时候,工程中的默认会包含一个Activity,而且会被默认为启动Activity

如果MAIN或者LAUNCHER在你的应用中被多次定义,你的应用的图标将不会在用户的应用列表中出现

 

Start一个Activity

Android应用与其他的过程式编程语言从一个Main()开始运行不同,Android系统通过触发一个特别的Activity生命周期中的一个回调方法来启动一个Activity。Android中有一系列的回调方法启动一个Activity,也有一系列的回调方法来终止一个Activity。

 

启动一个新的Activity实例


大部分应用都会提供多个不同的Activity来实现不同的用户功能,当用户通过点击应用图标来启动应用,或者另外一个Activity接受用户的指令来来调用你的应用,系统都会通过调用onCreate()创建一个新的Activity实例。

你必须通过实现onCreate()方法来完成基本的应用启动逻辑,而且这个只会在Activity的生命周期中发生一次。你如你可以通过onCreate()应该定义用户接口和一些系统级的变量。

Destroythe Activity销毁一个Activity


Activity生命周期的第一个回调方法是onCreate(),而其最后一个回调方法是onDestroy()。系统通过调用这个方法将Activity的实例彻底的从系统内存中移除。

大部分的应用可能不需要实现这个方法,因为很多本地类的实例在onPause()和onStop()方法中已经销毁了。当然如果你的应用有些后台运行的线程,或者一些其他的长期占有的系统资源,你也应该在onDestroy()中销毁他们。

注意:系统一般都会在调用了onPause()和onStop()之后再调用onDestroy(),但是如果你在onCreate()方法中调用了finish()则是一个例外。

Pause、Resume一个Activity

在应用的使用过程中,一个在前台的Activity可能会被部分的遮盖,这回导致Activity进入Pause状态。当一个Activity被完全遮盖时,其进入stop状态。

当你的Activity进入pasued状态,系统调用你的Activity的onPause()方法,从而使你有机会停止你的正在运行的动作,保存你应该保存的信息以保证用户回来的时候不丢失信息

Pause YourActivity


当系统调用你的Activity的onPause方法,从技术角度来说意味着你的Activity还部分可视,可视更多的是用户将要离开此Activity,这个Activity将进入Stopped状态。你应该使用onPause()方法完成以下功能:

  • 停止一切可能会消耗CPU的动画后者动作
  • 提交未保存的修改,当然是用户期望保存的修改
  • 释放一切可能会消耗电池而你的应用也不需要的资源

一般来说,你不需要用onPause方法将用户修改存储到永久存储器上,唯一的例外就是用户期望自动存储的信息。不管怎么说,你应该避免执行一些消耗CPU的动作,以避免影响Activity之间切换的感觉,你应该在onStop方法中执行那些大运算量的关闭操作。

ResumeYour Activity


系统如果要将你的Activity从Paused状态唤醒,需要调用onResume方法。

记得你Activity任何一次到前台的运行都需要调用onResume方法。所以你所要实现onResume方法来初始化那些被onPause方法释放的组件。

Stop、Restart一个Activity

恰当的停止和重启你的Activity是其生命周期中非常重要的过程,他们保证你的应用对用户来说一致都是可用的,并且不会丢失他们的数据,你需要:

  • 当用户从你的应用切换到其他的应用,你的Activity能够正确的停止;当用户从跟其他的应用切换回你的应用,你的应用可以正确的重启;
  • 当用户在你的Activity中启动了另外一个新的Activity,当前Activity在新的Activity创建之后停止;当用户点击返回按钮,原先的Activity可以正确重启;
  • 当用户在使用你的应用的时候接到一个电话,你的Activity可以正确的停止;

Activity类提供了两个生命周期方法onStop()
onRestart(),从而可以定义该Activity停止和重启的过程中的动作。与pause状态不同,stop状态保证UI不再可见,而用户的输入焦点在另外一个Activity中。

注意:在Activity处于停止状态时,系统还是将其保存在系统内存当中,所以你可以不实现onStop()
onRestart()方法,甚至你可以连onStart()方法也不必实现。因为大部分Activity都比较简单,你可以通过onPause方法来停止正在运行的动作,断开系统资源。

Stop YourActivity


当你的Activity被呼叫了onStop方法,它已经不可见了,应该释放所有用户在不使用情况下不需要的资源。当Activity被停止,系统可能销毁这个Activity实例,甚至在极端情况下杀死应用进程已恢复内存等系统资源。

尽管onPause方法在onStop方法之前调用,但是你需要使用onStop方法来执行那些耗CPU资源的操作,例如同步数据库。

Start/RestartYour Activity


当一个处于停止状态的Activity需要被唤醒到前台运行,它的onRestart方法将被调用,同时onStart方法也会被调用。onRestart方法只有在系统从Stop状态下被激活才会被调用,所以你可以利用其来恢复那些在stop过程中被释放的资源。

通过onRestart方法来恢复Activity状态的做法不是非常普遍,所以我们没有为这个方法列出一个指南。因为onStop方法应该将Activity中的资源释放,所以你需要在onRestart中将这个资源重新实例化,同样在Activity创建的时候也需要将这些资源实例化,因为这个原因我们一般将onStart和onStop做资源申请与释放上的对应。

例如,用户切换出你的应用并且长时间没有返回,onStart方法就是去确认系统资源有没有被正确设置的好地方。

当系统需要系会你的Activity,它需要调用你的Activity的onDestroy()方法。因为你已经在onStop方法中释放了大部分的资源,onDestroy方法应当没有很多工作需要完成。这个方法是你释放资源,避免内存泄露的最后的机会,你需要确保所有附加的线程等被正确的停止

Recreate一个Activity

在一些情况下,Activity因为应用的正常动作被销毁,例如用户按返回按钮,或者应用受到finish()调用。系统也会在Activity长时间不用或者系统需要资源的情况下销毁Activity。

当你的Activity因为按返回或者自我终结的方式销毁的,系统就会认为Activity不被需要了,会在系统中消失。但是,在因为系统的限制而被销毁的Activity,虽然其实例已经被销毁,但是系统仍然会记住其曾经存在过,当用户切换回来的时候,系统会重新创建一个实例,并且将在销毁时保存在bundle中的实例状态数据传递给这个实例。

注意:Activity在用户旋转屏幕的时候都会销毁并重新创建一个Activity

保存和恢复 Activity 状态


当你的Activity加入stop状态的时候系统调用onSaveInstanceState(),你可以一系列的键值对来存储目前的状态。当Activity需要Resume的时候,系统调用onRestoreInstanceState()将这些键值对恢复出来。

 

抱歉!评论已关闭.