watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXV4aWt1b18x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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,假设用户点击backbutton,回到上一个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);
}

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

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

    Android官方文档和其他不少资料都对Activity生命周期进行了详细介绍,在结合资料和项目开发过程中遇到的问题,本文将对Activity生命周期进行一次总结. Activity是由Activit ...

  2. Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程

    最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...

  3. Android开发艺术1之Activity的生命周期

    作为<Android开发艺术探索>这本书的第一篇博客,我就多说几句.本系列博客旨在对书中相关内容进行解读,简化,提供一个入门到提高的流程.不敢说书评,也不能说教程,只希望对有些人有帮助就好 ...

  4. 【转】Android总结篇系列:Activity生命周期

    [转]Android总结篇系列:Activity生命周期 Android官方文档和其他不少资料都对Activity生命周期进行了详细介绍,在结合资料和项目开发过程中遇到的问题,本文将对Activity ...

  5. android.os.Process.killProcess(android.os.Process.myPid())与Activity生命周期的影响

    如果通过finish方法结束了一个Activity,那么根据Activity的生命周期,则会自动调用Activity的销毁方法onDestory(),但是在项目中遇到这样的一个问题,就是​Activi ...

  6. Android基础相关面试问题-activity面试问题(生命周期,任务栈,启动模式,跳转协议,启动流程)

    关于Android的一些面试题在15年就已经开了这个专栏了,但是一直木有坚持收集,而每次面对想要跳槽时大脑一片空白,也有些恐惧,因为毕境面试都是纯技术的沟通,要想让公司对你的技术能有所认可会全方位的进 ...

  7. Android SDK上手指南:Activity与生命周期

    Android SDK上手指南:Activity与生命周期 2013-12-26 15:26 核子可乐译 51CTO 字号:T | T Activity生命周期并不仅仅在用户运行应用程序之后才开始生效 ...

  8. android 入门-生命周期 activity

    生命周期 activity http://blog.csdn.net/android_tutor/article/details/5772285 http://www.cnblogs.com/John ...

  9. Activity生命周期,切换,参数传递,bundle(包),值对象,Activity参数返回,Activity的启动模式

    Activity代表手机屏幕的一屏,或是平板电脑中的一个窗口.它是android应用中最重要的组成单元之一,提供了和用户交互的可视化界面.在一个Activity中,可以添加很多组件,这些组件负责具体的 ...

随机推荐

  1. Android MMC/EMMC/MTD Partition Layout

    Android devices have a couple of partitions to store different data. The common ones are the recover ...

  2. Overview of MySQL Programs

    http://blog.163.com/digoal@126/blog/static/16387704020110198756512/

  3. 经常使用哈希函数的比較及其C语言实现

    基本概念 所谓完美哈希函数.就是指没有冲突的哈希函数.即对随意的 key1 != key2 有h(key1) != h(key2). 设定义域为X,值域为Y, n=|X|,m=|Y|.那么肯定有m&g ...

  4. hybrid App h5二级页面返回的时候保持与一级页面浏览的位置一致

    最近在开发公司hybrid app的时候,需要将原本原生的配置中心模块统一变更为H5,做完之后从测试那里反馈回来这样一个问题,当滑到页面底部或中部的时候进入子页面进行设置,返回的时候页面应该定位到离开 ...

  5. 委托、多播委托、泛型委托Func,Action,Predicate,ExpressionTree

    当试图通过一个事件触发多个方法,抽象出泛型行为的时候,或许可以考虑使用委托.     通过委托构造函数或委托变量把方法赋值给委托 private delegate double DiscountDel ...

  6. MVC文件上传04-使用客户端jQuery-File-Upload插件和服务端Backload组件实现多文件异步上传

    本篇使用客户端jQuery-File-Upload插件和服务端Badkload组件实现多文件异步上传.MVC文件上传相关兄弟篇: MVC文件上传01-使用jquery异步上传并客户端验证类型和大小  ...

  7. failed to get the task for process XXX(解决方案)

    引人: iOS真机调试程序,报如下错误信息: failed to get the task for process XXX 原因: 证书问题,project和targets的证书都必须是开发证书,AD ...

  8. Eclipse:引用一个项目作为类库(图文教程)

    前言:项目TestRoid要引用Volley项目作为类库 步骤如下:   一:选择导入Android项目 二:选择Volley项目路径导入   三:右击Volley项目,点击Properties 四: ...

  9. Eclipse——浏览功能

    一,打开变量声明 或选择opendeclaration就能够查看变量的定义 二.打开类型层次结构(open type hierarchy) 或者点击F4 watermark/2/text/aHR0cD ...

  10. CentOS 6.5安装配置Nginx

    Ubuntu下安装nginx,直接apt-get install nginx就行了,很方便. 但是今天装了CentOS6.5,直接yum install nginx不行,要先处理下源,下面是安装完整流 ...