Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?

原创链接:http://blog.csdn.net/zhao_3546/article/details/12843477,转载请注明,谢谢。

最近在研究Activity的启动流程,老罗的blog在看,也找了其它资料学习,也跟过Android4.3的源码,

在跟代码的过程中,突然想到下面的这个问题:

Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?

网上太多根据Android开发规范翻译转载的内容,都不是我想要的答案,那就自己分析下。

如下是一段典型的Activity间切换的日志,从AActivity切换到BActivity:

10-17 20:54:42.247: I/com.example.servicetest.AActivity(5817): onCreate() 1166919192 taskID=66
10-17 20:54:42.263: I/com.example.servicetest.AActivity(5817): onStart() 1166919192 taskID=66
10-17 20:54:42.263: I/com.example.servicetest.AActivity(5817): onResume() 1166919192 taskID=66
10-17 20:54:46.997: I/com.example.servicetest.AActivity(5817): onPause() 1166919192 taskID=66
10-17 20:54:47.021: I/com.example.servicetest.BActivity(5817): onCreate() 1166971824 taskID=66
10-17 20:54:47.028: I/com.example.servicetest.BActivity(5817): onStart() 1166971824 taskID=66
10-17 20:54:47.028: I/com.example.servicetest.BActivity(5817): onResume() 1166971824 taskID=66
10-17 20:54:47.099: I/com.example.servicetest.AActivity(5817): onStop() 1166919192 taskID=66

当触发从AActivity切换到BActivity时的日志如下:

10-17 20:54:46.997: I/com.example.servicetest.AActivity(5817): onPause() 1166919192 taskID=66
10-17 20:54:47.021: I/com.example.servicetest.BActivity(5817): onCreate() 1166971824 taskID=66
10-17 20:54:47.028: I/com.example.servicetest.BActivity(5817): onStart() 1166971824 taskID=66
10-17 20:54:47.028: I/com.example.servicetest.BActivity(5817): onResume() 1166971824 taskID=66
10-17 20:54:47.099: I/com.example.servicetest.AActivity(5817): onStop() 1166919192 taskID=66

先AActivity的onPause()被调用,然后是BActivity的初始化流程(onCreate() --> onStart() --> onResume()),再然后是AActivity的onStop()被调用。

有点意思,为什么不是先AActivity的onPause()、onStop()被调用,然后再BActivity的初始化流程(onCreate() --> onStart() --> onResume())?

或者又为什么不是先BActivity的初始化流程(onCreate() --> onStart() --> onResume()),再AActivity的onPause()、onStop()被调用?

如果所有的初始化都在onCreate()中实现,会有什么问题?

首先,Activity的onCreate()被调用时,Activity还不可见,如果要做一些动画,既然视图还不存在,在onCreate中来启动动画,明显有问题;

其次,AActivity 切换到 BActivity,再切换到 AActivity(我们假定是AActivity的同一个实例),由于实例已经存在,所以onCreate不会再被调用,那AActivity从后台切换至前台时,有可能需要一些初始化,那就没法再被调用到了,也有问题;

如果所有的初始化都在onStart()中实现,会有什么问题?

首先,onCreate()注释中,是明确建议 setContentView()、findViewById() 要在 onCreate() 中被调用,但我实测了一下,在onStart()中调用 setContentView()、findViewById() 功能也是正常的;

其次,onStart() 被调用时,Activity可能是可见了,但还不是可交互的,onResume()的注释中都明确地说了这不是Activity对用户是可见的最好的指示器,onStart() 在这之前被调用,那有一些特殊的初始化相关的逻辑在这里被调用也会有问题。

如果把所有的去初始化都在onStop()中实现,会有什么问题?

1、 在 onResume() 的注释中,建议是在onResume()中打开独占设备(比如相机),与onResume()对应的是onPause(),所以所有的去初始化操作放在onStop()中执行,可能会引出新的问题;

2、onStop() 的注释中明确地写了,在内存不足而导致系统无法保留此进程的情况下,onStop() 可能都不会被执行。

我的老Android手机的相机应用如果未正常关闭,相机在不重启系统的情况下就无法再正常启动,估计就和这个机制有关;相机进程是被强制杀掉的,而导致去初始化操作未被正常执行。

Activity间跳转时,为什么是先AActivity的onPause()被调用,然后是BActivity的初始化流程(onCreate() --> onStart() --> onResume()),再然后是AActivity的onStop()被调用?

1、在 onResume() 的注释中,建议是在onResume()中打开独占设备(比如相机),与onResume()对应的是onPause(),关闭相机的操作也应该在此方法中被调用;否则,考虑一下如下场景:

如果AActivity打开了相机,我们点击某按钮要跳转到BActivity中,BActivity也想打开相机;假设AActivity的onPause() 在 BActivity启动后再被调用,

那BActivity根本就无法再正常启动相机。

2、onPause() 的注释中,也明确地说了,在这个方法中执行停止动画等比较耗CPU的操作,如果不先执行这些操作,就先启动新应用,然后再来执行此操作,确实是不合逻辑;

从AActivity切换到BActivity的日志如下:

10-17 20:54:46.997: I/com.example.servicetest.AActivity(5817): onPause() 1166919192 taskID=66
10-17 20:54:47.021: I/com.example.servicetest.BActivity(5817): onCreate() 1166971824 taskID=66
10-17 20:54:47.028: I/com.example.servicetest.BActivity(5817): onStart() 1166971824 taskID=66
10-17 20:54:47.028: I/com.example.servicetest.BActivity(5817): onResume() 1166971824 taskID=66
10-17 20:54:47.099: I/com.example.servicetest.AActivity(5817): onStop() 1166919192 taskID=66

从逻辑的完整性和用户体验的角度来分析,这样实现确实是比较合理的,当用户触发某事件切换到新的Activity,用户肯定是想尽快进入新的视图进行操作,

上面已经说了,在onResume()一般会打开独占设备,开启动画等,

当需要从AActivity切换到BActivity时,先执行AActivity中的与onResume()相对应的onPause()操作,比如关闭独占设备,关闭动画,或其它耗费cpu的操作;

以防止BActivity也需要使用这些资源,关闭耗CPU的操作,也有利于BActivity运行的流畅。

底层执行AActivity的onPause()时,有一定的时间限制的,当ActivityManagerService通知应用进程暂停指定的Activity时,如果对应的onPause()在500ms内还没有执行完,ActivityManagerService就会强制关闭这个Activity。如下就是对应的onPause()执行超时常量定义:

    // How long we wait until giving up on the last activity to pause.  This// is short because it directly impacts the responsiveness of starting the// next activity.static final int PAUSE_TIMEOUT = 500;  // 定义在ActivityStack.java中

AActivity中比较消耗资源的部分关闭后,再切换到BActivity中执行BActivity的初始化,显示BActivity中的View。

当BActivity已经执行显示出来了,用户可以交互,后台再去执行AActivity的onStop()操作,即使这里面有些比较耗时的操作,也没有关系,这是在后台执行所以也不影响用户的体验。

Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?相关推荐

  1. onCreate onStart onResume onStop onPause onDestroy onRestart onWindowFocusChanged

    一.函数调用情形 1.启动游戏 onCreate onStart onResume onWindowFocusChanged 2.锁屏(已启动游戏) onPause onStop onWindowFo ...

  2. Android Activity did not call finish() prior to onResume() completing

    Activity did not call finish() prior to onResume() completing 这个错误是针对6.0以上Activity使用Theme.NoDisplay ...

  3. Android Activity 以及 Application 生命周期

    在日常开发中(对又是日常开发).你会发现很多逻辑如果只有onCreate和onDestory完全不够用.所以稍微系统的了解一下Activity生命周期的相关知识,也很有必要. 本篇简单学习Androi ...

  4. Android Activity生命周期★

    1.Activity Activity由Activity栈管理.启动一个新的Activity后,此Activity将被加入到Activity栈顶,之前的Activity位于此Activity底部. A ...

  5. Android——Activity浅析

    1. Activity生命周期 一个Activity从启动到结束会以如下顺序经历整个生命周期: onCreate()->onStart()->onResume()->onPause( ...

  6. (Android) Activity生命周期总结

    活动(Activity)的生命周期 0.前言 熟悉Activity的生命周期,可以让开发者更加了解程序的运行过程,有利于写出更加连贯流畅的程序,而且相关于合理管理应用资源,提供更好的用户体验. 1.返 ...

  7. android管理activity顺序,android activity 六个主要函数以及一些调用顺序

    Android中一个Activity一般都需要实现六个函数: onCreate(), onStart(), onResume(),onPause(),onStop(),onDestroy(). onC ...

  8. something about Android activity

    Activiy的注意事项 -> 生命周期: 包含以下7个状态:onCreate, onStart, onResume, onPause, onStop, onDestroy, onRestart ...

  9. android activity 实际,Android学习感悟之Activity

    Android学习感悟之Activity,包含生命周期.启动模式以及一些Activity中常用的方法. 序 在Android开发中,用的最为平凡的,最不能少的就是Activity了,所以作为学习感悟的 ...

最新文章

  1. 强势推荐一位 Python 原创自动化大佬!
  2. Android开发之底部导航栏标准
  3. 动态代理以及对应Spring中AOP源码分析
  4. LaTex文章中插入Visio及Matlab矢量图
  5. excel数据输入模型前的转换
  6. Moo.fx 超级轻量级的 javascript 特效库
  7. python画二次函数图像的顶点_画二次函数图像的步骤
  8. (严蔚敏版)数组的顺序存储表示和实现代码
  9. arcgis如何打开tif_实例|ArcGiS导出的dxf,在CASS中如何变身?
  10. 《编程之美》阅读分享
  11. android 绕过动态权限,android绕过permission验证及fork进程权限提升
  12. syncnavigator关于win10、win8系统无法注册机进行激活的问题
  13. c语言 十进制转十六进制算法,十进制转十六进制算法
  14. NSIS添加everyone权限
  15. kernel日志时间转换函数
  16. C++实现控制台迷宫小游戏
  17. TCP/IP 第1章 概 述
  18. win7系统打印机开启服务器,开启打印机服务【设置模式】
  19. 断言信息与元素等待_Sinno_Song_新浪博客
  20. 芝加哥大学计算机科学在哪个学院,芝加哥大学计算机专业怎么样?

热门文章

  1. 常用设计模式之抽象工厂模式
  2. mybatis的配置文件中selectKey标签问题
  3. Activity小技巧
  4. android 在自定义的listview(有刷新加载项)列表中,数据过少时不能铺满整个屏幕时,header和footer同时显示问题...
  5. VS2010 创建WindowsService服务
  6. [转]JavaScript var obj = { id:1, name:jacky } 大括号是啥意思?
  7. 高性能SQLServer通用分页存储过程
  8. spring mvc 中文乱码 post与get的方法解决
  9. P2839 [国家集训队]middle
  10. springMVC接收前端参数的方式