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. HDU 4649 Professor Tian(反状态压缩dp,概率)

    本文出自   http://blog.csdn.net/shuangde800 题目链接:点击打开链接 题目大意 初始有一个数字A0, 然后给出A1,A2..An共n个数字,这n个数字每个数字分别有一 ...

  2. maven打包出错: Failed to clean project: Failed to delete

    maven打包出错: Failed to clean project: Failed to delete 出现这种错误,通常是由于您已启动了另一个tomcat 进程,导致报错,关闭tomcat进程即可 ...

  3. Javascript 面向对象编程(一):封装(转载)

    Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果 ...

  4. firedac引擎DATASNAP多表查询和多表提交

    firedac引擎DATASNAP多表查询和多表提交 属性设置FDTableAdapter1.SchemaAdapter := FDSchemaAdapter;FDTableAdapter1.DatS ...

  5. 解决Arcgis10.2.2中dbf文件用EXCEL打开乱码问题

    1.开始 -- 运行,输入”Regedit“,打开 注册表 . 2.如是用的是 10.x 版本 ArcGIS Desktop,定位到 ‘计算机\HKEY_CURRENT_USER\Software\E ...

  6. JobDataMap 不能被序列化如何解决研究中

    JobDataMap被用来保存一系列的(序列化的)对象,这些对象在Job执行时可以得到.JobDataMap是Java Map接口的一个实现,而且还增加了一些存储和读取主类型数据的便捷方法. 如果使用 ...

  7. sql查询前后两位

    SQL排名的问题,A这个人在数据库里排第十,怎么查询一个他前面两位,后面两位,包括自己的五条数据,各位有啥高招? DECLARE @table TABLE ( id INT PRIMARY KEY , ...

  8. chromium对网页获取favicon

    每一个网页都有一个favicon,在历史记录的保存中须要用到.在content文件夹下,这个没有实现. 以下说一下我的实现过程: web_contents_impl.cc文件里有方法:WebConte ...

  9. (转)不通过web.config在运行时注册httpmodules

    https://blog.csdn.net/kufeiyun/article/details/7763070 在asp.net4 中,我们知道可以不用任何配置让一个方法在appdomain中尽早执行, ...

  10. 文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write

    文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write close(关闭文件) 相关函数 ope ...