Activity 生命周期

来源:互联网 发布:mysql strict mode 编辑:程序博客网 时间:2024/05/21 03:28

Activity 生命周期探索(一)

众所周知,在我们的安卓中打交道最多的就是Activity了,那么Activity 究竟是个什么东西呢?我们来看一下官方文档的解释:

Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。

现在网上的很多博客只是单纯的讲Activity的生命周期,并没有告诉我们为什么要了解Activity的生命周期,那么我们为什么要了解他的生命周期呢?

通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要。 Activity 的生命周期会直接受到 Activity 与其他 Activity、其任务及返回栈的关联性的影响。

说白了,就是我们经常有一些操作是在activity的不同阶段来完成的,比如我需要在我们的onCreate()中调用我们的setContentView方法来定义我们的activity页面布局,在比如当我们的页面不是焦点的时候,我们要暂停我们的一些线程的操作等等。
下面我们来分析一下官方给出的一张图:
这里写图片描述

下面我们就通过一个小Demo来具体看一下一个完整的activity生命周期的各个阶段所执行的方法首先使我们的代码,非常简单:

public class AvtivityLife extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_avtivity_life);        Log.e("执行:","onCreate");    }    @Override    protected void onStart() {        super.onStart();        Log.e("执行:","onStart");    }    @Override    protected void onResume() {        super.onResume();        Log.e("执行:","onResume");    }    @Override    protected void onRestart() {        super.onRestart();        Log.e("执行:","onRestart");    }    @Override    protected void onPause() {        super.onPause();        Log.e("执行:","onPause");    }    @Override    protected void onStop() {        super.onStop();        Log.e("执行:","onPause");    }    @Override    protected void onDestroy() {        super.onDestroy();        Log.e("执行:","onPause");    }}

我们只是在我们的生命周期的各个阶段打印了一个log来看一下我们的执行情况。然后我们就开始启动我们的程序:
打印结果如下:

06-05 01:42:07.909 5313-5313/com.lxt.administrator.myblobdemo E/执行:: onCreate06-05 01:42:07.909 5313-5313/com.lxt.administrator.myblobdemo E/执行:: onStart06-05 01:42:07.909 5313-5313/com.lxt.administrator.myblobdemo E/执行:: onResume

我们的Activity必定要先执行onCreate()方法,来创建一个Activity,在我们可以看见Activity之前调用onStart()方法,在Activity获得焦点的时候来执行onResume(),(此时Activity处于任务栈的顶层)。
然后我按了一下home键,我们来看一下打印结果:

06-05 01:49:28.821 5313-5313/com.lxt.administrator.myblobdemo E/执行:: onPause

可以看到执行了onPause方法,也就是说我们的Activity目前不是处于我们的任务栈的顶层,我想这也就是判断我们的当前Activity是否获得焦点的依据吧,如果他处于任务栈的顶层,那么证明这个Activity获得了焦点,否则没有。
当我们再一次启动我们的demo我们可以看到我们的打印结果为:

06-05 01:54:06.813 5313-5313/com.lxt.administrator.myblobdemo E/执行:: onRestart06-05 01:54:06.813 5313-5313/com.lxt.administrator.myblobdemo E/执行:: onStart06-05 01:54:06.813 5313-5313/com.lxt.administrator.myblobdemo E/执行:: onResume

我们先是执行了onRestart(),紧接着又执行了onStart()OnResume(),这里的onRestart()是在Activity 已停止并即将再次启动前调用。
始终后接 onStart()。
下面我们通过一个按钮来结束我们的Activity来看一下具体会走哪些步骤

06-05 02:24:36.122 4419-4419/com.lxt.administrator.myblobdemo E/执行:: onPause06-05 02:24:36.986 4419-4419/com.lxt.administrator.myblobdemo E/执行:: onStop06-05 02:24:36.986 4419-4419/com.lxt.administrator.myblobdemo E/执行:: onDestroy

可以看到我们分别执行了onPause,onStop,onDestroy,onPause我们知道,因为我们的Activity失去了焦点,那么什么情况下会执行我们的onStop呢?

Activity 对用户不再可见时调用。如果 Activity 被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就可能发生这种情况。
如果 Activity 恢复与用户的交互,则后接 onRestart(),如果 Activity 被销毁,则后接 onDestroy()。

两种情况下,

  1. 我们的Activity要被销毁
  2. 我们的Activity要被一个新的Activity覆盖

那什么情况下会调用我们的onDestroy()呢?

在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。 当 Activity 结束(有人调用 Activity 上的 finish()),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。 您可以通过 isFinishing() 方法区分这两种情形。

要么是我们代码中添加finish()方法,否则一直占用在内存中,知道我们的系统为了节省空间而暂时的销毁他,才会调用此方法。

下面我来总结一下我们的内容

首次启动:
onCreate –> onStart –> onResume
按下返回按键:
onPause ->onStop ->onDestroy
按下home键:
onPause ->onStop
再次打开:
onRestart ->onStart ->onResume
屏幕旋转:
onCreate ->onStart ->onResume

默认的在旋转屏幕时Activity会重新创建,当然我们也可以配置我们的清单文件,来实现屏幕旋转时不会重新创建新的activity

android:configChanges="keyboardHidden|orientation|screenSize"(sdk>13时需加上screenSize)

FirstActivity 到SecondActivity:
onPause ->onStop
从SecondActivity按back键的时候:
onRestart ->onStart ->onResume

0 0