Activity的生命周期
Hello,巴友们好,小菜我又来发博文啦。上篇文章给大家简单的介绍了一下Activity,以及如何创建一个最简单的Activity并且在上面显示hello android!
我们知道要创建一个自己的Activity就必须继承Activity这个类,并且实现它的回调方法,以便Activity在本身的生命周期中的两个不同状态切换时供系统调用。
那什么是Activity的生命周期呢?Activity的生命周期有哪些呢?什么时回调方法呢?今天我们就来回答这3个问题。
首先我们先看看google官方给出的Activity生命周期的图。
这张图中包含了Activity的所有生命周期,已经它们改变时的条件。
Activity的生命周期包括:
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onRestart()
- onDestroy()
这7个方法就是Activity的生命周期,也是回调方法。为什么这么说呢?我们在了解Activity的生命周期时一定要有一个这样的概念:“是操作系统在调用我们,而不是我们在调用操作系统”也就是说操作系统已经定义好了Activity的各种生命状态的点,我们要做的只是在不同的生命周期完成不同的操作就可以了。就了这个概念就不难理解为什么这7个方法又称为回调方法了。
那这些方法是什么时候被系统调用?又是什么时候结束的呢?
从上图中我们可以看见,activity启动之后,就会运行:
OnCreate()-àonStart()-àonResume()方法
当另外一个Activity被启动时,旧的Activity会调用:
OnPause()-àonStop()方法
这时候旧的Activity会继续在后台运行,除非系统资源不够用了,操作系统才会销毁这些不可见的Activity.
如果旧的Activity重新开始在前台运行就会调用:
OnRestart()-àonStart()-àonResume()方法
直到退出该Activity才会调用:onDestroy()方法。
现在我们就对这7个方法的运行条件进行单个的分析。
- onCreate():当Activity第1次启动时才调用。如果该Activity是第2次调用则不会运行onCreate方法,而直接运行onStart()方法。比如启动了一个新的Activity,旧的Activity转入了后台,当旧的Activity在前台再次运行时就不会再执行onCreate()方法了。由于这个特性,一般可以在onCreate()方法中初始化一些只需要初始化一次的变量,当然这都不是固定的,你可以根据你的业务需求来决定。
- onStart():当这个Activity对用户可见之前被调用。基本上onCreate()方法和onRestart()方法后面总是伴随着onStart()方法,反之则不成立。
- onResume():当Activity能够被用户看见的时候被调用。
- 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的启动。导致用户体验下降。
- onStop():当然大多数情况下,新的Activity总会充满整个屏幕,这就意味着旧的Activity将不可见。当旧的Activity不可见时,就会调用onStop()方法了。
- onRestart():当新的Activity充满整个屏幕并且结束运行旧的Activity又在前台重新运行,就会调用旧的Activity的onRestart()方法,前提是旧的Activity没有被系统回收掉。
- 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.