Activit系列之---Activity的生命周期

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值