关闭

Activity生命周期总结

标签: Activity生命周期总结
385人阅读 评论(0) 收藏 举报
分类:

Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。

 

一个应用通常由多个彼此松散联系的 Activity 组成。一般会指定应用中的某个 Activity 为“主” Activity,即首次启动应用时呈现给用户的那个 Activity。而且每个 Activity 均可启动另一个 Activity,以便执行不同的操作。每次新 Activity 启动时,前一 Activity 便会停止,但系统会在堆栈(“返回栈”)中保留该 Activity。当新 Activity 启动时,系统会将其推送到返回栈上,并取得用户焦点。返回栈遵循“后进先出”堆栈机制,因此,当用户完成当前 Activity 并按“返回”按钮时,系统会从堆栈中将其弹出(并销毁),然后恢复前一 个Activity。

 

当一个 Activity 因某个新 Activity 启动而停止时,系统会通过该 Activity 的生命周期回调方法通知其这一状态变化。Activity 因状态变化—系统是创建 Activity、停止 Activity、恢复 Activity 还是销毁 Activity—而收到的回调方法可能有若干种,每一种回调方法都会提供执行与该状态变化相应的特定操作的机会。例如,停止时,Activity 应释放任何大型对象,例如网络或数据库连接。当 Activity 恢复时,可以重新获取所需资源,并恢复执行中断的操作。这些状态转变都是 Activity 生命周期的一部分。


下图为Activity生命周期图。

 

根据Activity的复杂程度,可能不需要实现所有生命周期方法。但是,了解每个方法并实现确保您的应用按照用户期望的方式运行的方法非常重要。正确实现您的Activity生命周期方法可确保您的应用按照以下几种方式良好运行,包括:

1、如果用户在使用您的应用时接听来电或切换到另一个应用,它不会崩溃。

2、在用户未主动使用它时不会消耗宝贵的系统资源。

3、如果用户离开您的应用并稍后返回,不会丢失用户的进度。

4、当屏幕在横向和纵向之间旋转时,不会崩溃或丢失用户的进度。


主要存在以下几个过程:

1、启动Activity:执行顺序为:onCreate->onStart->onResume

2、结束Activity:执行顺序为:onPause->onStop->onDestoty,但是有一点需要注意:当在onCreate里面调用finish的时候,会直接调用onDestory。

3、锁屏:执行顺序为:onPause

4、解锁:执行顺序为:onResume

5、弹出半透明对话框:执行顺序为:onPause

6、结束半透明对话框:执行顺序为:onResume

7、跳转到别的Activity:假设本activity为A,跳转的activity为B,则执行顺序为:A:onPause -> B:onCreate->onStart->onResume->A:onStop,也就说ActivityA先onPause,当启动完B后再onStop,这就是为什么不能在onPause里面执行耗时操作的原因,因为耗时的操作会阻碍Activity的跳转,耗时的操作应该在onStop中完成。当然,如果必须在第一个 Activity 停止时向数据库写入数据,以便下一个 Activity 能够读取该数据,那么操作就必须在onPause里面完成。

8、从别的Activity返回:假设从上面的activityB返回到activityA,则执行顺序为:B:onPause->A:onRestart->onStart->onResume->B:onStop->onDestory。


总而言之,主要分为两部分:

(1)、当activity部分可见的时候,只会onPause而不会继续执行onStop,然后恢复的时候相对应执行onResume。

一般此时在onPause执行下述操作:

1、停止动画或其他可能消耗CPU的操作

2、提交未保存的更改

3、释放系统资源,比如广播接收器、传感器手柄(比如 GPS) 或当您的Activity暂停且用户不需要它们时仍然可能影响电池寿命的任何其他资源,比如如果你使用摄像头,那么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;
    }
}

当用户从“暂停”状态继续您的Activity时,系统会调用 onResume() 方法。每当Activity进入前台时系统便会调用此方法,包括它初次创建之时。 同样地,应该实现onResume() 初始化在 onPause() 期间释放的组件并且执行每当Activity进入“继续”状态时必须进行的任何其他初始化操作(比如开始动画和初始化只在Activity具有用户焦点时使用的组件),比如执行摄像头的初始化操作:

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


(2)、当activity完全不可见的时候,会执行:onPause->onStop,然后恢复的时候相对应执行:onRestart->onStart->onResume,只是需要注意当前Activity和即将要跳转的Activity的生命周期的执行顺序。

当Activity收到onStop回调时,它不再可见,此时应该释放几乎所有用户不使用时不需要的资源,应该在onStop中执行更大、占用更多CPU资源的关闭操作,比如向数据库写入信息。


重新创建Activity

当Activity因用户按了返回 或Activity自行完成而被销毁时,系统的 Activity 实例概念将永久消失,因为行为指示不再需要Activity。 但是,如果系统因系统局限性(而非正常应用行为)而销毁Activity,尽管 Activity 实际实例已不在,系统会记住其存在,这样,如果用户导航回实例,系统会使用描述Activity被销毁时状态的一组已保存数据创建Activity的新实例。 系统用于恢复先前状态的已保存数据被称为“实例状态”,并且是 Bundle 对象中存储的键值对集合。


注意:每次用户旋转屏幕时,Activity将被销毁并重新创建。 当屏幕方向变化时,系统会销毁并重新创建前Activity,因为屏幕配置已更改并且Activity可能需要加载备用资源(比如布局)。


当系统由于某种原因意外销毁Activity的时候,系统会先调用 onSaveInstanceState()。系统会向该方法传递一个 Bundle,你可以在其中使用 putString() 和 putInt() 等方法以名称-值对形式保存有关 Activity 状态的信息。然后,如果系统终止你的应用进程,并且用户返回您的 Activity,则系统会重建该 Activity,并将 Bundle 同时传递给 onCreate() 和 onRestoreInstanceState()。你可以使用上述任一方法从 Bundle 提取您保存的状态并恢复该 Activity 状态。如果没有状态信息需要恢复,则传递给你的 Bundle 是空值(如果是首次创建该 Activity,就会出现这种情况),具体过程如下图所示:

无法保证系统会在销毁你的 Activity 前调用 onSaveInstanceState(),因为存在不需要保存状态的情况(例如用户使用“返回” 按钮离开你的 Activity 时,因为用户的行为是在显式关闭 Activity)。 如果系统调用onSaveInstanceState(),它会在调用 onStop() 之前,并且可能会在调用 onPause() 之前进行调用。

 

不过,即使你什么都不做,也不实现 onSaveInstanceState(),Activity 类的 onSaveInstanceState() 默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个 View 调用相应的 onSaveInstanceState() 方法,让每个视图都能提供有关自身的应保存信息。Android 框架中几乎每个小工具都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改。例如,EditText 小工具保存用户输入的任何文本,CheckBox 小工具保存复选框的选中或未选中状态。你只需为想要保存其状态的每个小工具提供一个唯一的 ID(通过 android:id 属性)。如果小工具没有 ID,则系统无法保存其状态。


具体代码就不贴了,只是记录一下方便日后查阅,有不足之处,还请指出。

参考加翻译:

https://developer.android.com/guide/components/activities.html

https://developer.android.com/training/basics/activity-lifecycle/index.html




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:234684次
    • 积分:3833
    • 等级:
    • 排名:第8644名
    • 原创:143篇
    • 转载:58篇
    • 译文:7篇
    • 评论:29条
    最新评论