[Android]管理Activity的生命周期

一、简要介绍

当用户开始,暂停,退出,重新进入一个APP的时候,APP中Activity实例在它生命周期的不同状态之间转换。比如当你第一次启动一个Activity时,Activity来到系统的前端获得用户焦点。在这个过程中,Android系统调用了一系列生命周期方法。如果用户启动或者切换到另一个APP,系统调用另外一系列的方法。

生命周期调用方法可以说明在用户离开或者重新进入Activity时,Activity执行哪些行为。

接下来我们将解释每一个Activity都有的生命周期方法,并且说明如何使用它们来完成用户需要的功能,并且在你不需要的时候不会占用过多的系统资源。

技术分享技术分享

首先来看官方给出的Activity状态变化图。方框表示Activity可能处于的状态,箭头表示Activity在不同状态转化时会调用的函数。

除去未启动和被摧毁,Activity在运行时可能出现5种状态。分别是Created,Started,Resumed,Paused,Stopped。但是自由三种状态是稳定的,Activity会在这三种状态中停留一段时间。它们分别是:

Resumed   在这种状态下,Activity在屏幕中显示并且与用户正常交互。正常运行的状态。

Paused  在这种状态下,Activity被另一个Activity部分地遮挡,另一个Activity是半透明的或者并没有覆盖整个屏幕。Activity处于Paused状态时不能与用户交互,并且不能执行任何代码。

Stopped 在这种状态下,Activity被完全遮挡,对用户不可见。当Activity处于Stopped状态时,Activity实例和状态信息还存在,但是布恩执行任何代码。

另外两个状态(Created,Started)是只能存在非常短的时间,系统会很快地调用下一个生命周期方法时Activity进入下一个状态,比如系统调用onCreate()之后,很快地继续调用onStart(),之后继续调用onResume().

 

二、启动和停止

用户点击一个App的图标之后,系统在AndroidManifest.xml中寻找声明的主Activity,然后调用主Activity的onCreate()函数。通常onCreate()要被重载来定义Activity需要的变量,声明UI元素。

TextView mTextView; // Member variable for text view in the layout

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity);
    
    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);
    
    // Make sure we‘re running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}

onCreate()完成调用之后,系统很快继续调用onStart()和onResume(),Activity不会停在Created和Started的状态。在onStart()调用完成之后,Activity对用户可见,之后系统继续调用onResume(),然后Activity停留在Resume状态,也就是正常运行的状态。直到一些事情发生改变这个状态。

 

Activity生命周期中第一个被调用的是onCreate(),而最后一个被调用的是onDestory()。这个方法被调用表示Activity实例从系统中被完全地去除。

大多数应用不需要西线这个方法,因为大多数局部类引用由Activity自动回收,剩下的回收清理工作需要在onPause()和onStop()中完成,但是如果Activity中有后台线程或者其他可能引起内存泄漏的资源,需要在onDestory()中回收。

比如:

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

 

三、暂停和恢复

当Activity被不完全遮挡时会调用onPause()进入Paused状态。

开发者需要重载onPause()来停止正在运行的行为或者保存一些需要永久保存的信息。

 

开发者需要在onPause()函数中实现的内容有:

1.停止动画挥着其他正在进行的消耗CPU的行为

2.保存一些变化(用户需要保存的变量)比如邮件的草稿。

3.释放系统资源,比如broadcast receiver,传感器句柄(比如GPS),或者其他耗电的资源。

比如,如果你的应用使用的照相机,那onPause()方法是一个很好的释放照相机的地方。

@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first

    // Release the Camera because we don‘t need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}

一般来说,onPause()中不需要保存用户变量,onPause()中需要保存的是应该自动保存的变量,比如邮件草稿。同时,onPause()中要避免CPU密集的工作,比如写入数据库,因为这会减慢转换到下一个Activity的视觉过程。CPU密集的保存工作应该放在onStop()中。

Activity从Paused状态恢复到Resumed状态时会调用onResume()。

Activity每次来到前端的时候都会调用onResume()函数,包括第一次创建应用的时候,因此onResume()中应该初始化onPause()中释放的资源并且执行Activity每次获得用户焦点都要执行的代码。

下面onResume()的例子是onPause()的逆过程,初始化在onPause()中释放的camera

@Override
public void onResume() {
    super.onResume();  // Always call the superclass method first

    // Get the Camera instance as the activity achieves full user focus
    if (mCamera == null) {
        initializeCamera(); // Local method to handle camera init
    }
}

 

 

翻译自http://developer.android.com/training/basics/activity-lifecycle/index.html

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。