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()。
两种情况下,
- 我们的Activity要被销毁
- 我们的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
- Activity 生命周期
- Activity生命周期
- Activity 生命周期
- Activity 生命周期
- Activity生命周期
- Activity生命周期
- Activity生命周期
- Activity生命周期
- Activity生命周期
- activity生命周期
- Activity 生命周期
- Activity生命周期
- Activity 生命周期
- activity生命周期
- Activity 生命周期
- Activity生命周期
- Activity生命周期
- Activity生命周期
- zip版tomcat(6,7)不能注册成windows服务或者注册后不能启动的问题解决
- unable to open input file:helloworld.asm
- Mac环境下JAVA开发环境搭建
- css2
- 第十五周项目1—程序填空
- Activity 生命周期
- LeetCode-342.Power of Four
- hql中String类型的日期比较方式
- 初学linux
- 解决Exception: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z 等一系列问题,lja
- Redis的安装和简单使用
- LightOJ 1011 Marriage Ceremonies
- 大型网站的架构设计详解2
- 一些基本概念