Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?
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这么多方法让应用去重载?相关推荐
- onCreate onStart onResume onStop onPause onDestroy onRestart onWindowFocusChanged
一.函数调用情形 1.启动游戏 onCreate onStart onResume onWindowFocusChanged 2.锁屏(已启动游戏) onPause onStop onWindowFo ...
- Android Activity did not call finish() prior to onResume() completing
Activity did not call finish() prior to onResume() completing 这个错误是针对6.0以上Activity使用Theme.NoDisplay ...
- Android Activity 以及 Application 生命周期
在日常开发中(对又是日常开发).你会发现很多逻辑如果只有onCreate和onDestory完全不够用.所以稍微系统的了解一下Activity生命周期的相关知识,也很有必要. 本篇简单学习Androi ...
- Android Activity生命周期★
1.Activity Activity由Activity栈管理.启动一个新的Activity后,此Activity将被加入到Activity栈顶,之前的Activity位于此Activity底部. A ...
- Android——Activity浅析
1. Activity生命周期 一个Activity从启动到结束会以如下顺序经历整个生命周期: onCreate()->onStart()->onResume()->onPause( ...
- (Android) Activity生命周期总结
活动(Activity)的生命周期 0.前言 熟悉Activity的生命周期,可以让开发者更加了解程序的运行过程,有利于写出更加连贯流畅的程序,而且相关于合理管理应用资源,提供更好的用户体验. 1.返 ...
- android管理activity顺序,android activity 六个主要函数以及一些调用顺序
Android中一个Activity一般都需要实现六个函数: onCreate(), onStart(), onResume(),onPause(),onStop(),onDestroy(). onC ...
- something about Android activity
Activiy的注意事项 -> 生命周期: 包含以下7个状态:onCreate, onStart, onResume, onPause, onStop, onDestroy, onRestart ...
- android activity 实际,Android学习感悟之Activity
Android学习感悟之Activity,包含生命周期.启动模式以及一些Activity中常用的方法. 序 在Android开发中,用的最为平凡的,最不能少的就是Activity了,所以作为学习感悟的 ...
最新文章
- 强势推荐一位 Python 原创自动化大佬!
- Android开发之底部导航栏标准
- 动态代理以及对应Spring中AOP源码分析
- LaTex文章中插入Visio及Matlab矢量图
- excel数据输入模型前的转换
- Moo.fx 超级轻量级的 javascript 特效库
- python画二次函数图像的顶点_画二次函数图像的步骤
- (严蔚敏版)数组的顺序存储表示和实现代码
- arcgis如何打开tif_实例|ArcGiS导出的dxf,在CASS中如何变身?
- 《编程之美》阅读分享
- android 绕过动态权限,android绕过permission验证及fork进程权限提升
- syncnavigator关于win10、win8系统无法注册机进行激活的问题
- c语言 十进制转十六进制算法,十进制转十六进制算法
- NSIS添加everyone权限
- kernel日志时间转换函数
- C++实现控制台迷宫小游戏
- TCP/IP 第1章 概 述
- win7系统打印机开启服务器,开启打印机服务【设置模式】
- 断言信息与元素等待_Sinno_Song_新浪博客
- 芝加哥大学计算机科学在哪个学院,芝加哥大学计算机专业怎么样?
热门文章
- 常用设计模式之抽象工厂模式
- mybatis的配置文件中selectKey标签问题
- Activity小技巧
- android 在自定义的listview(有刷新加载项)列表中,数据过少时不能铺满整个屏幕时,header和footer同时显示问题...
- VS2010 创建WindowsService服务
- [转]JavaScript var obj = { id:1, name:jacky } 大括号是啥意思?
- 高性能SQLServer通用分页存储过程
- spring mvc 中文乱码 post与get的方法解决
- P2839 [国家集训队]middle
- springMVC接收前端参数的方式