4、Android Activity的生命周期 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);
}
时间: 2024-10-28 16:57:41

4、Android Activity的生命周期 Activity的生命周期的相关文章

Activity在异常情况下的生命周期——Android开发艺术探索笔记

欢迎转载,转载请注明出处 http://blog.csdn.net/l664675249/article/details/50638398 Activity在异常情况下的生命周期 关于Activity正常情况下的生命周期请参考这篇文章,本文主要讲解Activity在异常情况下的生命周期. 情况1:资源相关的系统配置发生改变 资源相关的系统配置发生改变,举个栗子.当前Activity处于竖屏状态的时候突然转成横屏,系统配置发生了改变,Activity就会销毁并且重建,其onPause, onSto

android开发之activity横竖屏切换时的生命周期以及横竖屏切换时的资源适配方案

背景:之前有过两篇写activity的博客 android之activity的生命周期详解:详细介绍了activity的整个生命周期.各状态间的转换和返回桌面时保存activity的状态 android之activity中onSaveInstanceState和onRestoreInstanceState的触发时机:介绍了activity中这两个方法的触发时机和作用 本篇博客会牵扯到里面的内容,如果你都有所了解可以直接往下看,如果不了解可以进去回忆下. 问题:在做应用的退出对话框时,发现如果对话

Android总结篇系列:Activity生命周期

Android官方文档和其他不少资料都对Activity生命周期进行了详细介绍,在结合资料和项目开发过程中遇到的问题,本文将对Activity生命周期进行一次总结. Activity是由Activity栈进管理,当来到一个新的Activity后,此Activity将被加入到Activity栈顶,之前的Activity位于此Activity底部.Acitivity一般意义上有四种状态: 1.当Activity位于栈顶时,此时正好处于屏幕最前方,此时处于运行状态: 2.当Activity失去了焦点但

【Android 初学】9、Activity生命周期

Start Android  1.如何在一个应用程序当中定义多个Activity 1)定义一个类,继承Activity 2)在该类当中,复写Activity当中的onCreate方法 3)在AndroidMainfest.xml文件当中注册该Activity(android程序中所有的控件都要在次注册) 2.启动一个Activity 1)生成一个意图对象(Intent) 2)调用setClass方法设置所要启动的Activity 3)调用startActivity方法启动Activity 3.A

android横竖屏切换时Activity的生命周期

1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate--> onStart--> onResume--> 3.按crtl+f12切换成横屏时 onSaveInstanceState--> onPause--> onStop--> onDestroy--> onCreate--> onStart--> onRestoreInstanceState--> onResume--> 4.再

Android基础知识:Day06 Activity生命周期和Intent用法

Day06 Activity生命周期和Intent用法 一.Activity的跳转 1. 创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.cate

跟着Google学Android —— 3.1 管好Activity的生命周期

当我们在app的不同页面间穿梭翱翔的时候,app中的Activity也在他们各自的生命周期中转换着不同的状态.当用户执行进入或者是离开某个Activity的操作时,Android系统会调用一系列生命周期的回调函数进行处理,而我们也可以重写这些回调函数,让Activity在不同的状态下执行我们想要的操作. 生命周期回调方法 下图展示了一个Activity的生命周期以及回调方法.这张图看起来就像是一个梯形金字塔,每一步都对应着Activity的一种生命状态. 在这些状态中,只有如下三种状态是静态的,

Android生命周期 &amp; Activity生命周期

了解Android系统的进程优先级的变化方式 1.Android系统一般是运行在资源受限的硬件平台上,因此资源管理对Android系统很重要 2.为了保证高优先级程序正常运行,可以在无任何警告的情况下终止低优先级程序,并回收其使用的系统资源,因此,Android程序并不能完全控制自身的生命周期,而是由ANdroid系统进行调度和控制的 3.Android系统尽可能地不主动去终止应用程序,即使生命周期结束的程序也会保存在内存中,以便再次快速启动 4.但在内存紧张时,系统会根据进程的优先级清除进程,

android 入门-生命周期 activity

生命周期 activity http://blog.csdn.net/android_tutor/article/details/5772285 http://www.cnblogs.com/JohnTsai/p/4052676.html 1.进app oncreate() -> onstart()->onresume() 2.退出app onpause()->onstop()->ondestroy() 3.点击home或者离开当前页面 onpause()->onstop()