Activity的生命周期

Hello,巴友们好,小菜我又来发博文啦。上篇文章给大家简单的介绍了一下Activity,以及如何创建一个最简单的Activity并且在上面显示hello android!

我们知道要创建一个自己的Activity就必须继承Activity这个类,并且实现它的回调方法,以便Activity在本身的生命周期中的两个不同状态切换时供系统调用。

那什么是Activity的生命周期呢?Activity的生命周期有哪些呢?什么时回调方法呢?今天我们就来回答这3个问题。

首先我们先看看google官方给出的Activity生命周期的图。

这张图中包含了Activity的所有生命周期,已经它们改变时的条件。

Activity的生命周期包括:

  1. onCreate()
  2. onStart()
  3. onResume()
  4. onPause()
  5. onStop()
  6. onRestart()
  7. onDestroy()

这7个方法就是Activity的生命周期,也是回调方法。为什么这么说呢?我们在了解Activity的生命周期时一定要有一个这样的概念:“是操作系统在调用我们,而不是我们在调用操作系统”也就是说操作系统已经定义好了Activity的各种生命状态的点,我们要做的只是在不同的生命周期完成不同的操作就可以了。就了这个概念就不难理解为什么这7个方法又称为回调方法了。

那这些方法是什么时候被系统调用?又是什么时候结束的呢?

从上图中我们可以看见,activity启动之后,就会运行:

OnCreate()-àonStart()-àonResume()方法

当另外一个Activity被启动时,旧的Activity会调用:

OnPause()-àonStop()方法

这时候旧的Activity会继续在后台运行,除非系统资源不够用了,操作系统才会销毁这些不可见的Activity.

如果旧的Activity重新开始在前台运行就会调用:

OnRestart()-àonStart()-àonResume()方法

直到退出该Activity才会调用:onDestroy()方法。

现在我们就对这7个方法的运行条件进行单个的分析。

  1. onCreate():当Activity第1次启动时才调用。如果该Activity是第2次调用则不会运行onCreate方法,而直接运行onStart()方法。比如启动了一个新的Activity,旧的Activity转入了后台,当旧的Activity在前台再次运行时就不会再执行onCreate()方法了。由于这个特性,一般可以在onCreate()方法中初始化一些只需要初始化一次的变量,当然这都不是固定的,你可以根据你的业务需求来决定。
  2. onStart():当这个Activity对用户可见之前被调用。基本上onCreate()方法和onRestart()方法后面总是伴随着onStart()方法,反之则不成立。
  3. onResume():当Activity能够被用户看见的时候被调用。
  4. onPause():当另外一个新的Activity启动时,首先会调用旧的Activity的onPause()方法。值得注意的是,在Android系统中,Activity并不一定会充满整个屏幕,这是由Activity的样式决定的,如果新的Activity并没有充满整个屏幕,那么旧的Activity依然是可见的,只是背景会变为半透明。这种情况下,系统是不会调用旧Activity的onStop()方法的,并且在新的Activity结束之后只调用旧Activity的onResume()方法。还要注意的是,从API上我们可以看到在onPause(),onStop(),onDestroy()这三个状态时进程是有可能被系统给kill掉的。在进程被系统kill掉之前onPause()是唯一保证能够被调用的方法,因为在需要紧急释放内存的情况下onStop(),onDestroy()方法可能不会被调用。因此我们应该在onPause()方法中保存我们的持久性数据。但是我们应该有选择性的在onPause()方法里添加操作,因为如果onPause()方法执行的时间过长,将会影响到新Activity的启动。导致用户体验下降。
  5. onStop():当然大多数情况下,新的Activity总会充满整个屏幕,这就意味着旧的Activity将不可见。当旧的Activity不可见时,就会调用onStop()方法了。
  6. onRestart():当新的Activity充满整个屏幕并且结束运行旧的Activity又在前台重新运行,就会调用旧的Activity的onRestart()方法,前提是旧的Activity没有被系统回收掉。
  7. onDestroy():当Activity被销毁之前调用。

以上就是Activity生命周期的详细描述。

咱们的大诗人陆游说的好:” 纸上得来终觉浅 绝知此事要躬行”。接下来咱们就一起动手,去验证一下Activity的生命周期。

首先先建立一个android project 取名为Activity_02.

创建一个Activity叫ActivityLifeCycle.在这个Activity中我们去实现这7个回调方法。并在这7个方法中打印一句话。

 1 package edu.activity.viking.test;
 2
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5
 6 public class ActivityLifeCycle extends Activity
 7 {
 8     /** Called when the activity is first created. */
 9     @Override
10     public void onCreate(Bundle savedInstanceState)
11     {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.main);
14         System.out.println("run onCreate");
15     }
16
17
18     @Override
19     protected void onStart()
20     {
21         System.out.println("run onStart");
22         super.onStart();
23     }
24
25
26     @Override
27     protected void onRestart()
28     {
29         System.out.println("run onRestart");
30         super.onRestart();
31     }
32
33     @Override
34     protected void onResume()
35     {
36         System.out.println("run onResume");
37         super.onResume();
38     }
39
40
41     @Override
42     protected void onPause()
43     {
44         System.out.println("run onPause");
45         super.onPause();
46     }
47
48     @Override
49     protected void onStop()
50     {
51         System.out.println("run onStop");
52         super.onStop();
53     }
54
55     @Override
56     protected void onDestroy()
57     {
58         System.out.println("run onDestroy");
59         super.onDestroy();
60     }
61 }

现在我们启动Activity看看控制台输出的信息。

我们可以看到在Activity启动的过程中,系统调用了

OnCreate()-àonStart()-àonResume()

三个方法。

我们现在按Back键退出,看看会运行什么。

我可以看到当我们退出Activity时系统调用了

OnPause()-àonStop()-àonDestroy()

三个方法。

接下来我们测试另外一种情况。我们需要在我们的Activity_02这个项目中再添加一个Activity,名叫:OtherActivity当然它也必须继承咱们的Activity

我们把新建立的OtherActivity也实现这7个方法并且打印一句话。

 1 package edu.activity.viking.test;
 2
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5
 6 public class OtherActivity extends Activity
 7 {
 8     @Override
 9     protected void onCreate(Bundle savedInstanceState)
10     {
11         super.onCreate(savedInstanceState);
12         setContentView(R.layout.other_activity);
13         System.out.println("OtherActivity onCreate");
14     }
15
16     @Override
17     protected void onStart()
18     {
19         System.out.println("OtherActivity onStart");
20         super.onStart();
21     }
22
23     @Override
24     protected void onRestart()
25     {
26         System.out.println("OtherActivity onRestart");
27         super.onRestart();
28     }
29
30     @Override
31     protected void onResume()
32     {
33         System.out.println("OtherActivity onResume");
34         super.onResume();
35     }
36
37     @Override
38     protected void onPause()
39     {
40         System.out.println("OtherActivity onPause");
41         super.onPause();
42     }
43
44     @Override
45     protected void onStop()
46     {
47         System.out.println("OtherActivity onStop");
48         super.onStop();
49     }
50
51     @Override
52     protected void onDestroy()
53     {
54         System.out.println("OtherActivity onDestroy");
55         super.onDestroy();
56     }
57 }

在onCreate方法中,我们使用了setContentView方法,这个方法指明我们要显示other_activity.xml文件。Other_activity.xml文件内容很简单。只有一个TextView控件显示一句话。

代码:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3         android:layout_width="fill_parent"
 4         android:layout_height="fill_parent"
 5         android:orientation="vertical"
 6 >
 7     <TextView
 8         android:layout_width="fill_parent"
 9         android:layout_height="wrap_content"
10         android:text="other_activity"
11     />
12 </LinearLayout>

然后我们必须修改ActivityLifeCycle文件。以下是修改好的代码。

 1 package edu.activity.viking.test;
 2
 3 import android.app.Activity;
 4 import android.content.Intent;
 5 import android.os.Bundle;
 6 import android.view.View;
 7 import android.widget.Button;
 8
 9 public class ActivityLifeCycle extends Activity
10 {
11     /** Called when the activity is first created. */
12     @Override
13     public void onCreate(Bundle savedInstanceState)
14     {
15         super.onCreate(savedInstanceState);
16         setContentView(R.layout.main);
17         System.out.println("run onCreate");
18         //通过findViewById这个方法从other_activity.xml中找到一个Button
19         Button button = (Button)findViewById(R.id.button);
20         //为按钮注册监听器
21         button.setOnClickListener(new View.OnClickListener()
22         {
23
24             public void onClick(View v)
25             {
26                 Intent intent = new Intent();
27                 intent.setClass(ActivityLifeCycle.this, OtherActivity.class);
28                 ActivityLifeCycle.this.startActivity(intent);
29             }
30
31         });
32     }
33
34
35     @Override
36     protected void onStart()
37     {
38         System.out.println("run onStart");
39         super.onStart();
40     }
41
42
43     @Override
44     protected void onRestart()
45     {
46         System.out.println("run onRestart");
47         super.onRestart();
48     }
49
50     @Override
51     protected void onResume()
52     {
53         System.out.println("run onResume");
54         super.onResume();
55     }
56
57
58     @Override
59     protected void onPause()
60     {
61         System.out.println("run onPause");
62         super.onPause();
63     }
64
65     @Override
66     protected void onStop()
67     {
68         System.out.println("run onStop");
69         super.onStop();
70     }
71
72     @Override
73     protected void onDestroy()
74     {
75         System.out.println("run onDestroy");
76         super.onDestroy();
77     }
78 }

本次的修改集中在onCreate方法中。

最后必须把新建立的OtherActivity在androidManifest.xml中进行注册,否则系统会报错噢。

到目前为止,我们的修改就完成了,我们再运行一下,看看控制台给出的信息。

程序运行后,同样是先执行ActivityLifeCycle中的onCreate-onStart-onResume方法。

我们点击OtherActivity按钮。

从图中我们可以看到,点击OtherActivity按钮后,旧的Activity立即执行了onPause方法,接着新的Activity执行了onCreate-àonStart-àonResume方法。当新的Activity变为可见状态时,旧的Activity执行了onStop方法。

这时我们再按back键,让新的Activity结束运行,让旧的Activity重新回到前台。

按back键后,新的Activity执行了onPause方法,接着旧的Activity执行了onRestart-àonStart-àonResume方法,这里值得注意的是,它并没有调用onCreate方法,而是执行了onRestart方法,这也证明了旧的Activity被新的Activity遮挡住以后,并没有被销毁掉,而是一直存在。所以当旧的Activity重新在前台运行时只调用onRestart方法而不会调用onCreate方法。

当旧的Activity为可见状态时,新的Activity调用了onStop-àonDestroy方法。也就是说新的Activity被销毁掉了。

如果这时候我们再按一次back键,旧的Activity也将会被销毁掉。

这时旧的activity就会执行onPause-àonStop-àonDestroy方法。

这种情况弄明白以后,我们就来说说,当新启动的Activity没有完全充满屏幕的情况,看看是否与上面解释的一样。那么我们怎么才能让新启动的Activity不充满屏幕呢?很简单,只需要在AndroidManifest.xml中的<activity>标签中添加一个属性即可。看图:

添加完这个属性后,我们再来看看运行的情况如何。

首次运行程序,还是调用onCreate-àonStart-àonResume方法。

点击OtherActivity按钮。

看,这次新的Activity并没有充满整个屏幕,所以旧的Activity只是调用了onPause方法,并没有调用onStop方法。

咱们按back键,回到上一个Activity.

当旧的Activity重新运行以后,果然只是调用了onResume方法。

再次点击back键。我们看到了这时候新的Activity才会调用onStop方法和onDestroy方法。为什么会这样呢?这一点小菜我也不是很明白,小菜猜想也许在第一次点击back键时,对话框式的activity只是被隐藏起来了,并没有被旧的Activity覆盖。所以并没有调用onStop和onDestroy方法。当然这都只是小菜个人的猜想,如果有大牛知道答案的,麻烦告诉小菜一声。省得小菜误人子弟了。

“这篇文章好长啊,我都快看不下去了”。没关系最后一个知识点了,大家再坚持一会。

最后的一个是不同的退出方式,不同的进入方式对Activity生命周期的影响。

以上总结了2种不同方式退出,2种不同方式进入Activity的情况。按Home键退出时起始Activity并没有销毁掉,也就是说并没有调用onDestroy方法。所以再2种不同的方式进入时,它依然时从onRestart方法开始运行。

而按back键退出时,Activity是被销毁掉了的,当以2种不同的方式再次运行时,Activity会从onCreate方法开始运行。

由于写的太多了,已经有人开始扔丑鸡蛋了,我就不给大家做示范了,大家自己动手实验一下,看看是不是我所说的这样。

好啦,好啦终于写完了,好长啊,没想到写了这么多。那么再见啦,下一篇博文咱们继续深入Activity.

转载于:https://www.cnblogs.com/zzy0127/archive/2012/09/05/2672104.html

Activit系列之---Activity的生命周期相关推荐

  1. Android组件系列----Activity的生命周期

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  2. Android学习笔记系列四2 —— Activity的生命周期

    2019独角兽企业重金招聘Python工程师标准>>> 启动一个Activity 使用startActivity(Intent intent). intent指定了你想要启动的act ...

  3. Android官方开发文档Training系列课程中文版:管理Activity的生命周期之停止和重启Activity

    原文地址 : http://android.xsoftlab.net/training/basics/activity-lifecycle/stopping.html#Start 在activity的 ...

  4. Android官方开发文档Training系列课程中文版:管理Activity的生命周期之启动一个Activity

    原文地址 : http://android.xsoftlab.net/training/basics/activity-lifecycle/index.html 导言 用户通过导航退出或者返回应用的时 ...

  5. activity 生命周期_从0系统学Android-2.4 Activity 的生命周期

    本系列文章,参考<第一行代码>,作为个人笔记 更多内容:更多精品文章分类 本系列持续更新中-. 2.4 Activity 的生命周期 掌握 Activity 的生命周期对于开发者来说是非常 ...

  6. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  7. Activity 之生命周期

    Activity 之生命周期 本文内容: 1. Activity 介绍 2. Activity 的生命周期2.1 生命周期图2.2 常见情况下生命周期的回调2.3 关于生命周期常见问题2.4 异常状态 ...

  8. Android笔记之Android基本控件布局与Activity的生命周期

    前言 喜欢安卓里千奇百怪的app,酷炫的UI或者好玩的游戏.想知道那些软件是如何做的,为什么我在微博里发一条消息,就能一直存在网上,让别人看到?为什么我点击一个按钮就出现了一个效果,某个功能?为什么滑 ...

  9. Android开发艺术探索笔记(一) Activity的生命周期和启动模式(1)

    Activity作为Android开发中最常用的一个组件,是Android开发人员必须熟悉且掌握的重要内容.同时Activity也是在面试中经常被问到的一个方向.因此,掌握Activity的重要性也不 ...

最新文章

  1. linux 上配置swoole
  2. mysql5.7配置_MySQL5.7详细配置教程
  3. 木七七施辰刚:我是这样将玩家次留提升了 5% 的
  4. Doom HDU - 5239(线段树+思维)
  5. vue目录结构及简单的开发介绍
  6. 如何查询mysql中执行效率低的sql语句
  7. python使用字典描述学生信息_Python字典(Dictionary)操作详解
  8. kafka python教程_由Flink与Kafka实践探究Kafka的两个问题
  9. 中国水灭火器行业市场供需与战略研究报告
  10. 关于服务器耗电量的计算
  11. Gbase相关学习总结
  12. 项目总结 -谷粒学院
  13. UCI数据集详解及其数据处理(附148个数据集及处理代码)
  14. 牛客网 吉首大学2019年程序设计竞赛(重现赛)A: SARS病毒(矩阵快速幂 + 碰巧降幂)
  15. matlab去eog,使用ICA去除32通道脑电数据中的眼电
  16. linux limits.conf 生效,linux修改limits.conf不生效
  17. Spring+SpringMVC+Mybatis(开发必备技能)04、mybatis自动生成mapper_dao_model(包含工具与视频讲解) 纯绿色版本、配套使用视频,100%运行成功
  18. Windows下维基百科中文语料库词向量训练
  19. 【备战春招/秋招系列】美团Java面经总结终结篇 (附详解答案) 1
  20. MATLAB SIMULINK电力电子仿真

热门文章

  1. Redis集群添加节点
  2. C++(2)--代码结构
  3. 算法(26)-最长系列
  4. python(9)-变量、input函数
  5. AIgorand区块链中VRF随机函数的应用
  6. Docker安装Redis以及配置Redis环境
  7. VUE - get 、post 请求后端接口:get 、post 写法 (Axios 中文说明文档地址)
  8. 真正理解 git fetch, git pull 以及 FETCH_HEAD
  9. Java List<Object>去掉重复对象-java8
  10. TFS2017持续发布中调用PowerShell启停远程应用程序