一:Activity的生命周期方法

Android提供了很多Activity的生命周期方法,比如我们常用的onCreate、onPause、onResume等。这里主要介绍粗粒度的周期方法,诸如onPostCreate、onPostResume等 这些细粒度的周期方法可以参考Android的API文档,在你需要更细层次的控制的时候可以使用这些细粒度的方法。粗粒度的周期方法有以下几个: onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy(),从名字上就可以看出来这些方法在什么时候执行。

二:测试Activity的生命周期方法的执行顺序

为了能更明白上这几个周期放的执行顺序,我们新建一个HelloWorld项目,在Activity中覆盖这几个方法,打印出日志就可以看出来执行顺序了

  1. 新建HelloWorld项目,详细步骤可以参见:

    Android教程之三:第一个Android应用,HelloWorld

  2. 修改main.xml内容为:
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:orientation="vertical"
    4. android:layout_width="fill_parent"
    5. android:layout_height="fill_parent"
    6. >
    7. <TextView
    8. android:layout_width="fill_parent"
    9. android:layout_height="wrap_content"
    10. android:text="第一个Activity"
    11. />
    12. <Button
    13. android:id="@+id/second"
    14. android:layout_width="wrap_content"
    15. android:layout_height="wrap_content"
    16. android:text="打开第二个Activity"/>
    17. </LinearLayout>
     

    这里主要是为增加一个文本显示和一个按钮用于显示信息和操作。

  3. 新建布局文件second.xml,内容如下:
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout
    3. xmlns:android="http://schemas.android.com/apk/res/android"
    4. android:orientation="vertical"
    5. android:layout_width="fill_parent"
    6. android:layout_height="fill_parent">
    7. <TextView
    8. android:layout_width="fill_parent"
    9. android:layout_height="wrap_content"
    10. android:text="第二个Activity"
    11. />
    12. <Button
    13. android:id="@+id/exit"
    14. android:layout_width="wrap_content"
    15. android:layout_height="wrap_content"
    16. android:text="退出"/>
    17. </LinearLayout>
     

    这里主要是为增加一个文本显示和一个退出按钮用于退出当前Activity。

  4. 新建一个Activity,名字为SecondActivity,内容如下:
    1. public class SecondActivity extends Activity {
    2. private final static String TAG="SecondActivity";
    3. @Override
    4. protected void onCreate(Bundle savedInstanceState) {
    5. super.onCreate(savedInstanceState);
    6. Log.v(TAG, "onCreate");
    7. setContentView(R.layout.second);
    8. //退出按钮
    9. Button btnExit=(Button)findViewById(R.id.exit);
    10. //为退出按钮设置单击事件
    11. btnExit.setOnClickListener(new OnClickListener() {
    12. @Override
    13. public void onClick(View v) {
    14. finish();//关闭当前Activity,也就是退出
    15. }
    16. });
    17. }
    18. @Override
    19. protected void onStart() {
    20. super.onStart();
    21. Log.v(TAG, "onStart");
    22. }
    23. @Override
    24. protected void onResume() {
    25. super.onResume();
    26. Log.v(TAG, "onResume");
    27. }
    28. @Override
    29. protected void onPause() {
    30. super.onPause();
    31. Log.v(TAG, "onPause");
    32. }
    33. @Override
    34. protected void onStop() {
    35. super.onStop();
    36. Log.v(TAG, "onStop");
    37. }
    38. @Override
    39. protected void onDestroy() {
    40. super.onDestroy();
    41. Log.v(TAG, "onDestroy");
    42. }
    43. }
     

    我在各个周期方法了都加了日志信息,便于跟踪Activity的运行过程

  5. 修改HelloWorld类,内容如下:
    1. public class HelloWorld extends Activity {
    2. private final static String TAG="HelloWorld";
    3. /** Called when the activity is first created. */
    4. @Override
    5. public void onCreate(Bundle savedInstanceState) {
    6. super.onCreate(savedInstanceState);
    7. Log.v(TAG, "onCreate");
    8. setContentView(R.layout.main);
    9. //打开第二个Activity的按钮
    10. Button btnSecond=(Button)findViewById(R.id.second);
    11. //设置单击事件
    12. btnSecond.setOnClickListener(new OnClickListener() {
    13. @Override
    14. public void onClick(View v) {
    15. startActivity(new Intent(HelloWorld.this,SecondActivity.class));
    16. }
    17. });
    18. }
    19. @Override
    20. protected void onStart() {
    21. super.onStart();
    22. Log.v(TAG, "onStart");
    23. }
    24. @Override
    25. protected void onResume() {
    26. super.onResume();
    27. Log.v(TAG, "onResume");
    28. }
    29. @Override
    30. protected void onPause() {
    31. super.onPause();
    32. Log.v(TAG, "onPause");
    33. }
    34. @Override
    35. protected void onStop() {
    36. super.onStop();
    37. Log.v(TAG, "onStop");
    38. }
    39. @Override
    40. protected void onDestroy() {
    41. super.onDestroy();
    42. Log.v(TAG, "onDestroy");
    43. }
    44. }
     
  6. 运行程序,分析结果,发现当程序启动的时候,日志信息为下图:

由此可见当打开一个Activity的时候,其周期方法执行顺序为:onCreate()->onStart()->onResume(),现在点击“打开第二个Activity”按钮,

当应用从Helloworld这个Activity启动SecondActivity的时候,将依次执行:(First指第一个MainActivity,Second指第二个)

First.onPause(); //在要调用另一个Activity时调用;

Second.onCreate();

Second.onStart(); //被看到

Second.onResume();

First.onStop(); //对应onStart(),是在Activity对用户不可见时调用;

三:分析结果

根据上面例子可见一个Activity在启动的时候会执行onCreate()->onStart()->onResume(),在结束(或离开)的时候会执行onPause()->onStop()->onDestroy(),这就是一个Activity的生命周期。 因此我们要在onCreate方法里把Activity的需要的东西准备好,也就是初始化;在onResume里对Activity里的东西做一些调整;在onPause做一些清理和保存工作(保存持久状态),因为这是最后的 机会,因为onPause完成之前Android不会结束托管Activity类的进程,而之后进程可能被结束。总结一下这几个周期方法的作用:

    1. onCreate():创建Activity调用,用于Activity的初始化,还有个Bundle类型的参数,可以访问以前存储的状态。
    2. onStart():Activity在屏幕上对用户可见时调用
    3. onResume():Activity开始和用户交互的时候调用,这时该Activity是在Activity栈的顶部。
    4. onPause():Activity被暂停时调用,也就是你要对你能看到的这个Activity说byebye的时候调用,这里可以做一些清理和保存工作
    5. onStop():Activity被停止或者Activity变成不可见时调用
    6. onDestroy():Activity被从内存中移除,一般发生在执行finish方法时或者Android回收内存的时候

好了,最后让我们看一个API提供的Activity的状态图吧,看了他相信你对Activity的生命周期会更了解,如下图:

第三章:Activity的生命周期的更多相关文章

  1. 《Android开发艺术探索》读书笔记 (1) 第1章 Activity的生命周期和启动模式

    第1章 Activity的生命周期和启动模式 1.1 Activity生命周期全面分析 1.1.1 典型情况下生命周期分析(1)一般情况下,当当前Activity从不可见重新变为可见状态时,onRes ...

  2. 第一章:Activity的生命周期和启动模式

    Activity是Android中四大组件之首,所以需要重视,尤其是启动方式,在AndroidManifest.xml中的注册信息 (一)Activity的生命周期 1.1.1 正常情况下的生命周期 ...

  3. 第一章——Activity的生命周期

    问题总结: 1.Activity完整的生命周期 2.当打开第二个Activity并关闭时候的生命周期. ①.解释为什么onPause()方法不要有耗时操作 3.Activity发生异常重启的时候问题: ...

  4. Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式

    Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...

  5. 第一章01-正常情况下Activity的生命周期

    一.Android下能见到的界面 Window Dialog Toast Activity 二.Activity的生命周期分析 典型情况下的生命周期 ​是指在有用户参与的情况下,Activity所经过 ...

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

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

  7. 【Android】11.1 Activity的生命周期和管理

    分类:C#.Android.VS2015: 创建日期:2016-02-21 一.基本概念 1.必须理解这些方法,否则你编的程序根本就没法在实际项目中使用 当然,如果仅仅是为了玩玩,或者仅仅是作为例子为 ...

  8. Android开发之Activity的生命周期以及加载模式

    本篇博客就来好好的搞一下Activity的生命周期,如果搞过iOS的小伙伴的话,Activity的生命周期和iOS中ViewController的生命周期非常类似.生命周期,并不难理解.一个人的生命周 ...

  9. Activity的生命周期

    Activity的生命周期 以往我们实现页面间的跳转都是实例化Intent类的对象,但是页面在我们眼前的出现与消失没有我们所看到的那么简单,它有一个复杂的生命周期,一个页面的出现,被覆盖,再次出现,被 ...

随机推荐

  1. eclipse删除了文件,找回方法

    本人通过eclipse在前段时间上传svn代码的时候,代码掉完了,导致的原因是:svn服务器上有有个一样的文件夹,只是大小写不同,但是svn会认为是一样的文件夹,导致svn[]判别不了传到哪个文件夹去 ...

  2. 随笔 | 分布式版本控制系统Git的安装与使用

    作业要求来自https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 GitHub远程仓库的地址https://github.com/W ...

  3. python基础(二)列表与字典

    列表list-数组stus=['苹果','香蕉','橘子','红枣',111.122,]# 下标 0 1 2 3 4#下标,索引,角标#print(stus[4]) #st=[]#空list#st=l ...

  4. node.js中通过dgram数据报模块创建UDP服务器和客户端

    node.js中 dgram 模块提供了udp数据包的socket实现,可以方便的创建udp服务器和客户端. 一.创建UDP服务器和客户端 服务端: const dgram = require('dg ...

  5. c#子线程线程中操作窗体更新的报错

    用 在执行上传时,由于操作较长窗体界面卡住,于是用task解决 Task t1 = new Task(manage.UploadData); t1.Start(); 结果不卡了,程序也传完了,运行到更 ...

  6. rsync 定时备份<crontab+backrsync.sh> 简陋版

    数据需要定时的备份至其它的目录中,但是备份之前检查检查一下是否有rsync正在运行,曾经因为数据过大,导致有很多rsync进程在跑,然后服务器有出现卡死的现象.最终写了一条bash,先检查一下是否有这 ...

  7. redis在游戏服务器中的使用初探(一) 环境搭建

    这里我们尝试在游戏服务器中的数据处理中使用redis 通过该系列文章能够学习 redis的基本操作 源码编译 客户端开源库的编译和使用 以及在游戏服务器中的缓存使用 作为初次摸索 尽量使得环境简单  ...

  8. ubuntu无法打开software-center

    ubuntu无法打开software-center BUG: 在ubuntu14.04LTS版本下,点击软件中心图标,过了一会软件未能启动,没有动静.用命令行启动报如下错误: perrin@Littl ...

  9. JAVA 8 主要新特性 ----------------(二)JDK1.8优点概括

    一.JDK1.8优点概括 1.速度更快 由于底层结构和JVM的改变,使得JDK1.8的速度提高. 2.代码更少(增加了新的语法 Lambda 表达式)          增加新特性Lambda表达式的 ...

  10. jquery print属性设置

    一,需求背景 项目中遇到打印功能,想实现完美的打印功能,对元素进行操作等,可以使用jquery print 插件. 二,依赖文件  git地址请戳这里 1,jquery 2,jquery.print- ...