前言

Android生命周期分为两部分: 

  • (1)典型情况下的生命周期
  • (2)异常情况下的生命周期

典型情况下的生命周期分析

图1 Activity的生命周期图解

图2 Activity生命周期的金字塔图 

(1)典型情况下的生命周期指在有用户参与的情况下,Activity所经过的生命周期的改变,正常情况下,Activity的常用生命周期有以下几种情况:

  • onCreate():Activity启动后第一个被调用的函数,常用来进行Activity的初始化,如创建View,绑定数据和恢复数据。
  • onStart():当Activity显示在屏幕上时,函数被调用。
  • onRestart():Activity从停止状态进入活动状态是调用。
  • onResume():Activity可以接受用户输入时,该函数被调用,此时的activity位于activity栈的栈顶。
  • onPause():当Activity进入暂停状态时,该函数被调用,一般用来保存持久的数据或释放占用的资源。
  • onStop():当Activity变为不可见后,该函数被调用,Activity进入停止状态。
  • onDestroy():在Activity被终止前,被调用。
/*1.onCreate:
    每个Activity在写代码的过程中都会看见这个函数,
    是声明周期的第一个方法。
    一般做一些资源和数据初始化的工作,
    比如绑定相对应的资源布局setContentView*/
        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
/*2.onRestart:
    字面意思表示Activity重新启动,这个状态一般由用户切换应用的行为产生,
    比如从应用切换到桌面或者切打开新的Activity,
    此时这个Activity就会调用onPause和onStop让这个Activity进入展厅状态。
    再回到这个Activity就是onRestart了*/
        @Override
    protected void onRestart() {
        super.onRestart();
    }
/*3.onStart:
    这个状态我理解就是Activity启动中的一个过程,
    就是启动中,但是还不能与用户交互(用户不可见),
    属于一个在后台的状态*/
        @Override
    protected void onStart() {
        super.onStart();
    }
/*4.onResume:
    表示Activity已经可见,且已经开始活动。
    与onStart类似的状态但是就是属于一种在前台的状态*/
        @Override
    protected void onResume() {
        super.onResume();
    }
/*5.onPause:
    是一个非常微妙的状态,处于正在停止的一个临界点,
    就很难重现这种状态,就是在停止过程中,
    先执行onPause然后在onStop执行之前,
    回到Activity执行onResume,这期间就是onPause的状态。
    此处可以做一些存储数据停止动画的工作,但是不能太耗时,
    不然会影响到新Activity的显示,只有这些操作做完,
    新Activity的OnResume才会执行。*/
        @Override
    protected void onPause() {
        super.onPause();
    }
/*6.onStop:
    表示Activity即将停止,可以做一些相对重量级的回收工作,
    同样不能太耗时。*/
    @Override
    protected void onStop() {
        super.onStop();
    }
/*onDestroy
    表示Activity即将被销毁,这是Activity生命的尽头,
    可以做一些回收工作和资源的释放。*/
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

(2)进一步地,可以将Activity分为3种生存期:

  • 完整生存期:在 onCreate() 和 onDestroy() 之间所经历的。
  • 可见生存期:在 onStart() 和 onStop() 之间所经历的。
  • 前台生存期:在 onResume() 和 onPause() 之间所经历的。

(3)Activity的活动状态

  • 运行状态:位于返回栈栈顶的活动。
  • 暂停状态:不在栈顶位置,但仍然可见。
  • 停止状态:不在栈顶位置,完全不可见。可能会被系统回收。
  • 销毁状态:在返回栈中移除的活动。

(返回栈:每启动一个新的活动,会在返回栈中入栈,并处于栈顶的位置。每销毁一个活动,处于栈顶的活动会出栈,前一个入栈的活动会重新处于栈顶的位置。)

异常情况下的生命周期分析 (1)系统配置发生改变引起生命周期的异常变化

举例:开启手机的自动旋转后,当Activity从竖屏状态转变为横屏时,系统会自动销毁原先的Activity并重建。如果不做特殊处理,那么每当系统配置改变时,Activity都会销毁重建,

如图所示:

图3 旋转手机时Activity的生命周期变化情况

当手机从竖屏转变为横屏时,可以看到原Activity执行: onPause -> onSaveInstanceState -> onStop -> onDestroy ,走完原Activity的生命周期。当原Activity销毁后又会迅速的开启新的Activity执行 :onCreate -> onStart -> onRestoreInstanceState -> onResume, 最终新的Activity显示在用户界面上。onSaveInstanceState 和 onRestoreInstanceState 两个方法仅在生命周期异常情况下执行。onSaveInstanceState主要是对异常销毁的Activity进行数据保存,onRestoreInstanceState主要是对存储的数据进行恢复,数据存取都是通过Bundle,因此我们可以在Bundle中附加个人数据进行读写。经过测试onSaveInstanceState在onStop前调用,onRestoreInstanceState在onStart方法后调用。这两个方法执行的过程中,系统会自动对视图进行信息数据的存取,例如:ListView的滚动位置等等。(2)资源内存不足导致低优先级的Activity被杀死

当系统资源不足时,系统会按照上述优先级去杀死目标的 Activity 所在的进程,并在后续通过 onSaveInstanceState 和 onRestoreInstanceState 来存储和恢复数据。如果一些后台的进程脱离了四大组件而独立运行,那么这个进程很快就被杀死。我们常常将后台工作放到 Service 中保持进程具有一定的优先级。

图4 configChanges添加orientation后的效果

当系统配置改变时Activity会销毁重建,通过在AndroidMainManifest.xml中为Activity添加configChanges属性去避免这个情况。configChanges的属性有很多,例如:orientation表示屏幕方向变化、KeyboardHidden表示虚拟键盘可访问性变化等,通过设置这些属性后当运行过程中发生上述情况Activity既不会销毁重建也不会调用 onSaveInstanceState 和 onRestoreInstanceState 两个方法,而是执行onConfigChanged方法。

问题: (1)onStart 和 onResume、onPause 和 onStop 从功能描述上看大同小异,到底有什么区别呢?

这两组方法对的回调意义不同,onState 和onStop 是从 Activity 是否可见这个角度来回调的,而 onResume 和 onPause 是从 Activity 是否位于前台这个角度来回调的,不过在实际使用中没有其他明显区别。

(2)假设当前Activity为A,如果这时用户打开了一个新的Activity B,那么B的onResume方法和A的onPause方法谁先执行呢?

根据Android的基本运行机制,不能在onPause中执行重量级的操作,因为必须onPause执行完成以后新Activity才能onResume。onPause和onResume都不能执行耗时的操作,尤其是onPause,这就意味着我们应该在onStop中操作,从而使新的Activity显示出来并切换到前台。

到此这篇关于Android开发Activity的生命周期详解的文章就介绍到这了,更多相关Android Activity 内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Android开发Activity的生命周期详解的更多相关文章

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  5. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  6. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  7. ios – 无法启动iPhone模拟器

    /Library/Developer/CoreSimulator/Devices/530A44CB-5978-4926-9E91-E9DBD5BFB105/data/Containers/Bundle/Application/07612A5C-659D-4C04-ACD3-D211D2830E17/ProductName.app/ProductName然后,如果您在Xcode构建设置中选择标准体系结构并再次构建和运行,则会产生以下结果:dyld:lazysymbolbindingFailed:Symbol

  8. Xamarin iOS图像在Grid内部重叠

    heyo,所以在Xamarin我有一个使用并在其中包含一对,所有这些都包含在内.这在Xamarin.Android中看起来完全没问题,但是在Xamarin.iOS中,图像与标签重叠.我不确定它的区别是什么–为什么它在Xamarin.Android中看起来不错但在iOS中它的全部都不稳定?

  9. ios – 如何在UIActivityViewController调用然后关闭后执行操作

    解决方法在这种情况下,您可以使用completionHadler:

  10. 在iOS上向后播放HTML5视频

    我试图在iPad上反向播放HTML5视频.HTML5元素包括一个名为playbackRate的属性,它允许以更快或更慢的速率或相反的方式播放视频.根据Apple’sdocumentation,iOS不支持此属性.通过每秒多次设置currentTime属性,可以反复播放,而无需使用playbackRate.这种方法适用于桌面Safari,但似乎在iOS设备上的搜索限制为每秒1次更新–在我的情况下太慢了.有没有办法在iOS设备上向后播放HTML5视频?解决方法iOS6Safari现在支持playbackRat

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部