Android中Activity的生命周期探讨

1、完整生命周期

上图是Android Activity的生命周期图,其中Resumed、Paused、Stopped状态是静态的,这三个状态下的Activity存在时间较长。

(1)Resumed:在此状态时,用户可以与Activity进行交互,Activity在最前端
(2)Paused:在此状态时,Activity被另外一个Activity遮盖,此Activity不可接受用户输入信息。另外一个Activity来到最前面,半透明的,但并不会覆盖整个屏幕。
(3)Stopped:在此状态时,Activity完全被隐藏,不可见。保留当前信息,Activity不执行任何代码。
(4)Created与Started:系统调用onCreate()后迅速调用onStart(),然后迅速执行onResume()。

以上就是Android的Activity整个生命周期。

2、主Activity

用户可以指定程序启动的主界面,此时被声明为“launcher或main”Activity的onCreate()方法被调用,成为程序的入口函数。该入口Activity可以在AndroidManifest.xml中定义主Activity。此时,主Activity必须使用以下标签声明:

代码如下:

<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>

3、一个新的Activity实例

系统首先调用新Activity的onCreate()方法,所以,我们必须实现onCreate()方法。如:声明UI元素、定义成员变量、配置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状态停留。

4、销毁Activity

Activity的最后一个回调是onDestroy(),系统会执行这个方法做为你的Activity要从系统中完全删除的信号。大多数APP不需实现此方法,因为局部类的references会随着Activity的销毁而销毁。并且Activity应该在onPause()和onStop()方法中执行清楚Activity资源的操作。如果Activity在onCreate()时创建的后台线程,或者是其他有可能导致内存泄露的资源,你应该在onDestroy()时杀死它们。

代码如下:

@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()后在调用onDestroy(),除非在onCreate()中调用了finish()。例如,如果你的Activity只是做了一个临时的逻辑跳转功能,它使用用来决定跳转到下一个Activity,这样,你需要在onCreate()中调用finish()方法。系统就会直接调用onDestroy方法,其他生命周期就不会被执行。

5、暂停与恢复

当前Activity被其它可见组件阻塞,当前Activity部分可见,当前Activity进入Pause状态。系统调用Activity中的onPause()方法,执行onResume()方法恢复。

当前Activity被其它组件完全阻塞,当前Activity完全不可见,则当前Activity进入Stop状态。

当系统调用你的Activity中的onPause(),从技术上讲,那意味着你的Activity仍然处于部分可见的状态。通常在onPause()回调方法里面做下面的事情。

(1)停止动画或者其他正在运行的操作,减少CPU浪费
(2)提交没有保存的改变,但仅仅是用户离开时保存的内容,如邮件
(3)释放系统资源,如broadcast receivers、sensors、GPS或者其他任何影响电量的资源。
(4)如果程序正在使用Camera,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()时执行CPU-intensive的工作,例如写数据到DB,因为他会导致切换Activity变得缓慢。这些工作应该放到onStop()中去坐。

如果,Activity实际上要被Stop,那么应减少在onPause中的工作量,提高流畅性。

恢复Activity

用户从Pause状态恢复时,调用onResume()方法。此时Activity处于最前台,包括第一次创建时,此时,应该在onResume中初始化那些你在onPause方法里释放掉的组件,并执行那些Activity每次进入Resumed state都需要的初始化动作。

代码如下:

@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
    }
}

6、停止与重启Activity

恰当的停止与重启Activity会使用户感知程序的进行。下面一些场景涉及停止与重启:

(1)用户打开最近使用的App的菜单并切换到另外一个App,此时,你的App是被停止的,用户回到你的App,那么你的Activity被重启。
(2)用户在App中启动一个新的Activity的操作,当前Activity会在新Activity创建后stop,如果用户点击back按钮,回到上一个Activity,重启
(3)用户使用App,接到来电时。

停止状态UI不可见。系统在Activity停止时会在内存中保存了Activity实例,有时不需事先onStop(),onRestart()甚至onStart()方法,因为大多数的activity相对简单,activity会自己停止与重启。你只需要使用onPause来停止正在运行的动作,并断开系统资源链接。

上图显示:当用户离开你的Activity,系统会调用onStop()来停止Activity,用户返回时调用onRestart(),然后迅速调用onStart()与onResume(),无论什么原因导致Activity停止,系统总会在onStop之前调用onPause

停止Activity

当你的Activity调用onStop方法,Activity不再可见,并且应该释放那些不再需要的所有资源,一旦你的Activity停止了,系统会在不需要的这个activity时销毁它的实例。在极端情况下,系统会直接杀死你的App进程,并且不执行Activity的onDestroy()回调函数,因此你需要在onStop()来释放资源,否则内存泄露。尽管onPause方法在onStop之前调用,应应该使用onStop来执行CPU-intensive的shut-down操作。如写数据到DB。

当Activity停止,其对象会保存在内存中,并且在Resume时重新调用,不需在恢复到Resumed state状态前初始化那些被保存在内存中得组件,系统为我们保存了每一个在布局中的视图的当前状态。即使系统会在Activity stop时销毁这个Activity,它仍然会保存View对象的状态到一个Bundle中,并且在用户返回这个Activity时恢复他们。

重新创建Activity:当Activity在屏幕被旋转时,会被destroy与recreated。此时会加载一些alternative的资源,如layout。默认情况下,系统使用Bundle实例来保存每一个视图对象中得信息。为了使Android系统能够恢复Activity中的View状态,每个View都必须有一个唯一的ID

为了确保额外更多的数据到saved instance state,在Activity的声明周期里面存在一个添加的回调函数,必须重写onSaveInstanceState(),当用户离开你的Activity时,系统会调用它。当系统调用这个函数时,系统会在你的Activity被一场Destroy时传递Bundle对象,这样,你可以增加额外的信息到Bundle中,并保存在系统中。如果系统在Activity被Destroy之后想重新创建这个Activity实例时,之前的那个Bundle对象会被传递到Activity的onRestoreInstanceState()方法和onCreate()方法中。

保存Activity状态:当Activity开始Stop时,系统会调用onSaveInstanceState(),因此你的Activity可以用键值对的集合来保存状态信息,这个方法会默认保存Activity视图的状态信息,例如在EditText组件中得文本或者是ListView的滑动位置。为了给Activity保存额外的状态信息,你必须实现onSaveInstanceState()并增加键值对到Bundle中。如:

代码如下:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

// Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

恢复Activity状态:当你的Activity从Destroy中重建,你可以从系统传递给你的Activity的Bundle中恢复保存的状态。onCreate()与onRestoreInstanceState()回调方法都接收到了同样的Bundle,里面包含同样的实例状态信息。因为onCreate()方法会在第一次创建新的Activity实例与重新创建之前被Destroy的实例时都被调用,你必须尝试读取Bundle对象之前检查它是否为NULL,如果为NULL,系统第一次创建新Activity。否则是恢复被Destroy的Activity。

代码如下:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

// Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

我们可以选择实现onRestoreInstanceState(),而不是在onCreate方法里恢复数据。onRestoreInstanceState()方法会在onStart()方法之后执行,系统仅仅会在存在需要恢复的状态信息时才会调用onRestoreInstanceState(),因此不需检查Bundle是否为NULL。

代码如下:

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

// Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

(0)

相关推荐

  • Android中Activity生命周期和启动模式详解

    Activity生命周期经典图解: 按键对生命周期的影响: BACK键: 当我们按BACK键时,我们这个应用程序将结束,这时候我们将先后调用onPause()->onStop()->onDestory()三个方法. 再次启动App时,会执行onCreate()->onStart()->onResume() HOME键: 当我们打开应用程序时,比如浏览器,我正在浏览NBA新闻,看到一半时,我突然想听歌,这时候我们会选择按HOME键,然后去打开音乐应用程序,而当我们按HOME的时候,A

  • android中Activity详解(生命周期、以各种方式启动Activity、状态保存,完全退出等)

    一.什么是Activity? 简单的说:Activity就是布满整个窗口或者悬浮于其他窗口上的交互界面.在一个应用程序中通常由多个Activity构成,都会在Manifestxml中指定一个主的Activity,如下设置 <actionandroid:name="AndroidintentactionMAIN" /> 当程序第一次运行时用户就会看这个Activity,这个Activity可以通过启动其他的Activity进行相关操作.当启动其他的Activity时这个当前的

  • Android Activity 横竖屏切换的生命周期

    前言 在开发中常要处理横竖屏切换,怎么处理先看生命周期 申明 Activity 横竖屏切换时需要回调两个函数 ,所以在此将这个两个函数暂时看成是Activity 横竖屏切换的生命周期的一部分,这两个函数如下 onSaveInstanceState(Bundle outState) :Activity 即将销毁时保存数据 onRestoreInstanceState(Bundle savedInstanceState) : Activity 重建或者恢复时候取出数据 横竖屏切换生命周期 1.启动程

  • 深入解读Android开发中Activity的生命周期

    什么是Activity        首先,Activity是Android系统中的四大组件之一,可以用于显示View.Activity是一个与用记交互的系统模块,几乎所有的Activity都是和用户进行交互的,但是如果这样就能说Activity主要是用来显示View就不太正确了. 在深入了解Activity之前,我们先要知道一下MVC设计模式,在JAVAEE 中MVC设计模式已经很经典了,而且分的也比较清晰了,但是在Android中,好多人对MVC在Android开发中的应用不是很清楚,下面我

  • Android中的Activity生命周期总结

    概述 有图有真相,所以先上图: 上图是从Android官网截下的Activity的生命周期流程图,结构非常清晰,它描述了Activity在其生命周期中所有可能发生的情况以及发生的先后顺序,下面就将结合此图详细介绍一下Activity的生命周期. Activity四大基本状态 Activity生命周期一般分为四个基本状态,分别是活动状态(running),暂停状态(paused),停止状态(stopped)和死亡状态. 1.活动状态(running) 活动状态一般是指该Activity正处于屏幕最

  • Android中Fragment与Activity的生命周期对比

    Fragment必须是依存于Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期.官网这张图很好的说明了俩者的关系: 可以看到Fragment比Activity多了几个额外的生命周期回调函数: onAttach(Activity); //当Activity与Fragment发生关联时调用 onCreateView(LayoutInflater,ViewGroup,Bundle); //创建该Fragment的视图 onActivityCreate(bun

  • Android基础之Activity生命周期

    子曰:温故而知新,可以为师矣.<论语> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细研读几遍,以领悟到作者的思想精髓. 近来回顾了一下关于Activity的生命周期,参看了相关书籍和官方文档,也有了不小的收获,对于以前的认知有了很大程度上的改善,在这里和大家分享一下. 熟悉javaEE的朋友们都了解servlet技术,我们想要实现一个自己的servlet,需要继承相应的基类,重写它的方法,这些方法会在合适的时间被serv

  • Android Activity的生命周期详细介绍

    Android Activity的生命周期详细介绍 生命周期描述的是一个类从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法.在这个过程中,会针对不同的生命阶段调用不同的的方法. Activity是Android中四大组件之一,是最常见的应用组件,也是用的最多的组件,它能够提供一个界面与用户进行交互.Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:onCreate  onDestory  onStart  onStop  onRes

  • Android开发系列二之窗口Activity的生命周期

    在上篇文章给大家介绍了android开发系列一之用按钮实现显示时间,感兴趣的朋友可以点击阅读详情. 在Activity从创建到销毁的过程中需要在不同的阶段调用7个生命周期的方法这7个生命周期方法定义如下: protected void onCreate(Bundle savedInstanceState) protected void onStart() protected void onResume() protected void onPause() protected void onSto

  • Activity跳转时生命周期跟踪的实例

    android应用当中Activity间相互跳转比较常见.本文将通过例子跟踪一下2个Activity间跳转过程中生命周期的变化过程. 整个操作过程如下图所示: 1. 打开应用,自动开启First Activity: 2. 按下"Jump Button"按钮,打开Second Activity: 3. 按下"回退"按钮,退出Second Activity,自动回到First Activity: 4. 按下"回退"按钮,退出应用,自动关闭First

  • Activity生命周期实例讲解

    Activity中有7个与生命周期有关的函数.其中onCreated()是activity第一次被启动时执行的,主要是初始化一些变量,onRestart()是当前activity重新被启动时调用的:绑定一些监听器等:onStart()是activity界面被显示出来的时候执行的:onResume()是当该activity与用户能进行交互时被执行:onPause()是另一个activity被启动,当前的activity就被暂停了,一般在该函数中执行保存当前的数据:onStop()表示另一个acti

  • 两分钟让你彻底明白Android Activity生命周期的详解(图文介绍)

    大家好,今天给大家详解一下Android中Activity的生命周期,我在前面也曾经讲过这方面的内容,但是像网上大多数文章一样,基本都是翻译Android API,过于笼统,相信大家看了,会有一点点的帮助 ,但是还不能完全吃透,所以我今天特意在重新总结一下.首先看一下Android api中所提供的Activity生命周期图(不明白的,可以看完整篇文章,在回头看一下这个图,你会明白的): Activity其实是继承了ApplicationContext这个类,我们可以重写以下方法,如下代码: 复

  • Android开发之activity的生命周期详解

    本文实例讲述了Android activity的生命周期.分享给大家供大家参考,具体如下: activity类处于android.app包中,继承体系如下: 1.Java.lang.Object 2.android.content.Context 3.android.app.ApplicationContext 4.android.app.Activity activity是单独的,用于处理用户操作.几乎所有的activity都要和用户打交道,所以activity类创建了一个窗口,开发人员可以通

  • android基础总结篇之一:Activity生命周期

    近来回顾了一下关于Activity的生命周期,参看了相关书籍和官方文档,也有了不小的收获,对于以前的认知有了很大程度上的改善,在这里和大家分享一下. 熟悉javaEE的朋友们都了解servlet技术,我们想要实现一个自己的servlet,需要继承相应的基类,重写它的方法,这些方法会在合适的时间被servlet容器调用.其实Android中的Activity运行机制跟servlet有些相似之处,Android系统相当于servlet容器,Activity相当于一个servlet,我们的Activi

  • Android Activity生命周期详解

    Activity 的生命周期. 一.理解Activity Activity是Android程序的4大组件之一. Activity是Android程序的表示层.程序的每一个显示屏幕就是一个Activity. 学过WEB开发的同学,可以把Activity理解成网页中的一个JSP文件:或者你可以把它理解成一个Windows的窗口. 下面看一下Activity类的继承关系: 从这里可以看到Activity是Context类的子类,大家对此先有个印象.  二.理解Activity的生命周期 手机最重要也是

随机推荐