Android activity lifecycle investigations

本文通过具体案例详细记录了Android中Activity生命周期方法的调用顺序,包括不同Activity间的切换、透明Activity的影响以及使用SurfaceView时的变化情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.sina.com.cn/s/blog_71545ece0100lbb9.html


最近做了一些小测试,用于细致研究基本的Activities 跳转之后各个系统方法的调用顺序.
以下,以测试时的Trace为线索来研究这个问题:
//////////////////////////////////////////////////////////////////
Case 1£¬A&B is un-translucent activity. Normal intent.
//////////////////////////////////////////////////////////////////
->A (Start A):
04-19 13:56:07.899: DEBUG/A(1708): onCreate
04-19 13:56:07.899: DEBUG/A(1708): onApplyThemeResource
04-19 13:56:07.909: DEBUG/A(1708): onContentChanged
04-19 13:56:07.909: DEBUG/A(1708): onStart
04-19 13:56:07.909: DEBUG/A(1708): onPostCreate
04-19 13:56:07.909: DEBUG/A(1708): onResume
04-19 13:56:07.909: DEBUG/A(1708): onPostResume
A->B (startActivityForResult)
04-19 13:56:15.589: DEBUG/A(1708): onPause
04-19 13:56:15.599: DEBUG/B(1708): onCreate
04-19 13:56:15.609: DEBUG/B(1708): onApplyThemeResource
04-19 13:56:15.609: DEBUG/B(1708): onContentChanged
04-19 13:56:15.609: DEBUG/B(1708): onStart
04-19 13:56:15.609: DEBUG/B(1708): onPostCreate
04-19 13:56:15.609: DEBUG/B(1708): onResume
04-19 13:56:15.609: DEBUG/B(1708): onPostResume
04-19 13:56:15.849: DEBUG/A(1708): onStop
B->    (finish B)
04-19 13:56:18.189: DEBUG/B(1708): onPause
04-19 13:56:18.189: DEBUG/A(1708): onActivityResult
04-19 13:56:18.189: DEBUG/A(1708): onRestart
04-19 13:56:18.189: DEBUG/A(1708): onStart
04-19 13:56:18.189: DEBUG/A(1708): onResume
04-19 13:56:18.189: DEBUG/A(1708): onPostResume
04-19 13:56:18.409: DEBUG/B(1708): onStop
04-19 13:56:18.409: DEBUG/B(1708): onDestroy

============================================================================
Case 2,   Activities with surface view
============================================================================
->A:
04-19 17:15:03.581: DEBUG/A(2023): onCreate
04-19 17:15:03.591: DEBUG/A(2023): onApplyThemeResource
04-19 17:15:03.591: DEBUG/A(2023): onContentChanged
04-19 17:15:03.591: DEBUG/A(2023): onStart
04-19 17:15:03.591: DEBUG/A(2023): onPostCreate
04-19 17:15:03.601: DEBUG/A(2023): onResume
04-19 17:15:03.601: DEBUG/A(2023): onPostResume
04-19 17:15:03.611: VERBOSE/RenderScript_jni(141): surfaceDestroyed
04-19 17:15:03.611: VERBOSE/RenderScript(141): setSurface 0 0 0x0
04-19 17:15:03.661: DEBUG/A(2023): surfaceCreated
04-19 17:15:03.661: DEBUG/A(2023): surfaceChanged

A->B: (startActivityForReslut)
04-19 17:15:22.581: DEBUG/A(2023): onPause
04-19 17:15:22.581: DEBUG/B(2023): onCreate
04-19 17:15:22.581: DEBUG/B(2023): onApplyThemeResource
04-19 17:15:22.591: DEBUG/B(2023): onContentChanged
04-19 17:15:22.591: DEBUG/B(2023): onStart
04-19 17:15:22.591: DEBUG/B(2023): onPostCreate
04-19 17:15:22.591: DEBUG/B(2023): onResume
04-19 17:15:22.591: DEBUG/B(2023): onPostResume
04-19 17:15:22.651: DEBUG/B(2023): surfaceCreated
04-19 17:15:22.651: DEBUG/B(2023): surfaceChanged
04-19 17:15:22.671: DEBUG/A(2023): surfaceDestroyed
04-19 17:15:22.851: DEBUG/A(2023): onStop
B->:
04-19 17:16:06.051: DEBUG/B(2023): onPause
04-19 17:16:06.111: DEBUG/A(2023): onActivityResult
04-19 17:16:06.111: DEBUG/A(2023): onRestart
04-19 17:16:06.111: DEBUG/A(2023): onStart
04-19 17:16:06.111: DEBUG/A(2023): onResume
04-19 17:16:06.111: DEBUG/A(2023): onPostResume
04-19 17:16:06.111: DEBUG/A(2023): surfaceCreated
04-19 17:16:06.111: DEBUG/A(2023): surfaceChanged
04-19 17:16:06.171: DEBUG/B(2023): surfaceDestroyed
04-19 17:16:06.351: INFO/ActivityManager(74): Displayed activity test.activity.flow/.MainActivity: 62826 ms (total 62826 ms)
04-19 17:16:06.351: DEBUG/B(2023): onStop
04-19 17:16:06.361: DEBUG/B(2023): onDestroy

==================================================================
Case 3,  A is no-translucent, but B is translucent. Both A&B don't use surfaceview
==================================================================
Start A:
04-19 17:36:11.431: DEBUG/A(2190): onCreate
04-19 17:36:11.431: DEBUG/A(2190): onApplyThemeResource
04-19 17:36:11.431: DEBUG/A(2190): onContentChanged
04-19 17:36:11.431: DEBUG/A(2190): onStart
04-19 17:36:11.431: DEBUG/A(2190): onPostCreate
04-19 17:36:11.431: DEBUG/A(2190): onResume
04-19 17:36:11.431: DEBUG/A(2190): onPostResume
A-B:
04-19 17:36:43.041: DEBUG/A(2190): onPause
04-19 17:36:43.081: DEBUG/B(2190): onApplyThemeResource
04-19 17:36:43.081: DEBUG/B(2190): onCreate
04-19 17:36:43.081: DEBUG/B(2190): onContentChanged
04-19 17:36:43.081: DEBUG/B(2190): onStart
04-19 17:36:43.081: DEBUG/B(2190): onPostCreate
04-19 17:36:43.081: DEBUG/B(2190): onResume
04-19 17:36:43.081: DEBUG/B(2190): onPostResume
B->: ( finish B)
04-19 17:37:16.211: DEBUG/B(2190): onPause
04-19 17:37:16.251: DEBUG/A(2190): onActivityResult
04-19 17:37:16.251: DEBUG/A(2190): onResume
04-19 17:37:16.251: DEBUG/A(2190): onPostResume
NOTES: in this case, after B is finished, B is not called onStop() & onDestroy()~~~!
==================================================================
Case 4, Activites use surfaceview & B is translucent
==================================================================
->A:
04-19 17:44:43.461: DEBUG/A(2236): onCreate
04-19 17:44:43.461: DEBUG/A(2236): onApplyThemeResource
04-19 17:44:43.471: DEBUG/A(2236): onContentChanged
04-19 17:44:43.471: DEBUG/A(2236): onStart
04-19 17:44:43.481: DEBUG/A(2236): onPostCreate
04-19 17:44:43.481: DEBUG/A(2236): onResume
04-19 17:44:43.481: DEBUG/A(2236): onPostResume
04-19 17:44:43.531: DEBUG/A(2236): surfaceCreated
04-19 17:44:43.531: DEBUG/A(2236): surfaceChanged
A->B: (startActivityForResult)
 
04-19 17:45:56.781: DEBUG/A(2236): onPause
04-19 17:45:56.811: DEBUG/B(2236): onApplyThemeResource
04-19 17:45:56.811: DEBUG/B(2236): onCreate
04-19 17:45:56.821: DEBUG/B(2236): onContentChanged
04-19 17:45:56.821: DEBUG/B(2236): onStart
04-19 17:45:56.821: DEBUG/B(2236): onPostCreate
04-19 17:45:56.821: DEBUG/B(2236): onResume
04-19 17:45:56.821: DEBUG/B(2236): onPostResume
04-19 17:45:56.891: DEBUG/B(2236): surfaceCreated
04-19 17:45:56.891: DEBUG/B(2236): surfaceChanged
B->:
04-19 17:47:45.081: DEBUG/B(2236): onPause
04-19 17:47:45.091: DEBUG/A(2236): onActivityResult
04-19 17:47:45.091: DEBUG/A(2236): onResume
04-19 17:47:45.091: DEBUG/A(2236): onPostResume
04-19 17:47:45.111: DEBUG/B(2236): surfaceDestroyed

==================================================================
Case 5, A,B,C activities. Activites use surfaceview & un-translucent
==================================================================
->A:
04-20 14:47:59.422: DEBUG/A(1136): onCreate
04-20 14:47:59.422: DEBUG/A(1136): onApplyThemeResource
04-20 14:47:59.472: DEBUG/A(1136): onContentChanged
04-20 14:47:59.472: DEBUG/A(1136): onStart
04-20 14:47:59.472: DEBUG/A(1136): onPostCreate
04-20 14:47:59.472: DEBUG/A(1136): onResume
04-20 14:47:59.472: DEBUG/A(1136): onPostResume
04-20 14:47:59.603: DEBUG/A(1136): surfaceCreated
04-20 14:47:59.603: DEBUG/A(1136): surfaceChanged
A->B:
04-20 14:48:24.962: DEBUG/A(1136): onPause
04-20 14:48:24.992: DEBUG/B(1136): onApplyThemeResource
04-20 14:48:24.992: DEBUG/B(1136): onCreate
04-20 14:48:25.012: DEBUG/B(1136): onContentChanged
04-20 14:48:25.042: DEBUG/B(1136): onStart
04-20 14:48:25.042: DEBUG/B(1136): onPostCreate
04-20 14:48:25.042: DEBUG/B(1136): onResume
04-20 14:48:25.042: DEBUG/B(1136): onPostResume
04-20 14:48:25.132: DEBUG/B(1136): surfaceCreated
04-20 14:48:25.132: DEBUG/B(1136): surfaceChanged
04-20 14:48:25.192: DEBUG/A(1136): onStop
04-20 14:48:25.192: DEBUG/A(1136): surfaceDestroyed
B->C:
04-20 14:50:56.162: DEBUG/B(1175): onPause
04-20 14:50:56.202: DEBUG/C(1175): onApplyThemeResource
04-20 14:50:56.202: DEBUG/C(1175): onCreate
04-20 14:50:56.222: DEBUG/C(1175): onContentChanged
04-20 14:50:56.222: DEBUG/C(1175): onStart
04-20 14:50:56.222: DEBUG/C(1175): onPostCreate
04-20 14:50:56.222: DEBUG/C(1175): onResume
04-20 14:50:56.222: DEBUG/C(1175): onPostResume
04-20 14:50:56.312: DEBUG/C(1175): surfaceCreated
04-20 14:50:56.312: DEBUG/C(1175): surfaceChanged
04-20 14:50:56.342: DEBUG/B(1175): surfaceDestroyed
04-20 14:50:56.362: DEBUG/B(1175): onStop
C->:
04-20 14:51:32.742: DEBUG/C(1175): onPause
04-20 14:51:32.772: DEBUG/B(1175): onActivityResult
04-20 14:51:32.782: DEBUG/B(1175): onRestart
04-20 14:51:32.782: DEBUG/B(1175): onStart
04-20 14:51:32.782: DEBUG/B(1175): onResume
04-20 14:51:32.782: DEBUG/B(1175): onPostResume
04-20 14:51:32.802: DEBUG/B(1175): surfaceCreated
04-20 14:51:32.802: DEBUG/B(1175): surfaceChanged
04-20 14:51:32.882: DEBUG/C(1175): surfaceDestroyed
04-20 14:51:32.912: DEBUG/C(1175): onStop
04-20 14:51:32.922: DEBUG/C(1175): onDestroy
B->:
04-20 14:52:03.032: DEBUG/B(1175): onPause
04-20 14:52:03.052: DEBUG/A(1175): onActivityResult
04-20 14:52:03.052: DEBUG/A(1175): onRestart
04-20 14:52:03.052: DEBUG/A(1175): onStart
04-20 14:52:03.052: DEBUG/A(1175): onResume
04-20 14:52:03.052: DEBUG/A(1175): onPostResume
04-20 14:52:03.082: DEBUG/A(1175): surfaceCreated
04-20 14:52:03.082: DEBUG/A(1175): surfaceChanged
04-20 14:52:03.152: DEBUG/B(1175): surfaceDestroyed
04-20 14:52:03.163: DEBUG/B(1175): onStop
04-20 14:52:03.172: DEBUG/B(1175): onDestroy
==================================================================
Case 6, A,B,C activities. Activites use surfaceview & A, C are un-translucent , B is translucent
==================================================================
->A:
04-20 14:58:20.032: DEBUG/A(1215): onCreate
04-20 14:58:20.032: DEBUG/A(1215): onApplyThemeResource
04-20 14:58:20.072: DEBUG/A(1215): onContentChanged
04-20 14:58:20.082: DEBUG/A(1215): onStart
04-20 14:58:20.082: DEBUG/A(1215): onPostCreate
04-20 14:58:20.082: DEBUG/A(1215): onResume
04-20 14:58:20.082: DEBUG/A(1215): onPostResume
04-20 14:58:20.202: DEBUG/A(1215): surfaceCreated
04-20 14:58:20.202: DEBUG/A(1215): surfaceChanged
A->B:
04-20 14:58:53.292: DEBUG/A(1215): onPause
04-20 14:58:53.322: DEBUG/B(1215): onApplyThemeResource
04-20 14:58:53.332: DEBUG/B(1215): onCreate
04-20 14:58:53.352: DEBUG/B(1215): onContentChanged
04-20 14:58:53.362: DEBUG/B(1215): onStart
04-20 14:58:53.362: DEBUG/B(1215): onPostCreate
04-20 14:58:53.362: DEBUG/B(1215): onResume
04-20 14:58:53.362: DEBUG/B(1215): onPostResume
04-20 14:58:53.452: DEBUG/B(1215): surfaceCreated
04-20 14:58:53.452: DEBUG/B(1215): surfaceChanged
B->C:
04-20 14:59:38.352: DEBUG/B(1215): onPause
04-20 14:59:38.372: DEBUG/A(1215): onStop
04-20 14:59:38.392: DEBUG/C(1215): onApplyThemeResource
04-20 14:59:38.392: DEBUG/C(1215): onCreate
04-20 14:59:38.412: DEBUG/C(1215): onContentChanged
04-20 14:59:38.412: DEBUG/C(1215): onStart
04-20 14:59:38.412: DEBUG/C(1215): onPostCreate
04-20 14:59:38.412: DEBUG/C(1215): onResume
04-20 14:59:38.412: DEBUG/C(1215): onPostResume
04-20 14:59:38.432: DEBUG/A(1215): surfaceDestroyed
04-20 14:59:38.532: DEBUG/C(1215): surfaceCreated
04-20 14:59:38.532: DEBUG/C(1215): surfaceChanged
04-20 14:59:38.552: DEBUG/B(1215): surfaceDestroyed
04-20 14:59:38.582: DEBUG/B(1215): onStop
C->:
04-20 15:01:33.282: DEBUG/C(1215): onPause
04-20 15:01:33.302: DEBUG/A(1215): onRestart
04-20 15:01:33.302: DEBUG/A(1215): onStart
04-20 15:01:33.312: DEBUG/B(1215): onActivityResult
04-20 15:01:33.312: DEBUG/B(1215): onRestart
04-20 15:01:33.312: DEBUG/B(1215): onStart
04-20 15:01:33.312: DEBUG/B(1215): onResume
04-20 15:01:33.312: DEBUG/B(1215): onPostResume
04-20 15:01:33.342: DEBUG/B(1215): surfaceCreated
04-20 15:01:33.342: DEBUG/B(1215): surfaceChanged
04-20 15:01:33.372: DEBUG/A(1215): surfaceCreated
04-20 15:01:33.372: DEBUG/A(1215): surfaceChanged
04-20 15:01:33.472: DEBUG/C(1215): onStop
04-20 15:01:33.482: DEBUG/C(1215): onDestroy
04-20 15:01:33.482: DEBUG/C(1215): surfaceDestroyed
B->:
04-20 15:02:56.012: DEBUG/B(1215): onPause
04-20 15:02:56.063: DEBUG/A(1215): onActivityResult
04-20 15:02:56.072: DEBUG/A(1215): onResume
04-20 15:02:56.072: DEBUG/A(1215): onPostResume
04-20 15:02:56.072: DEBUG/B(1215): surfaceDestroyed
04-20 15:02:56.132: DEBUG/B(1215): onStop
04-20 15:02:56.132: DEBUG/B(1215): onDestroy
====================
测试告一段落,总结一下:
1)当一个Activity被完全遮蔽之后,他会被onStop
2)在使用了surfaceview的情况下,surfaceChange/sufaceCreate/surfaceDestory的调用基本上遵循如下原则:当新的Activity的surface被创建出来之后,旧的被销毁。
3)surfaceDestory是与onStop协同出现的。但是他们谁先被调用,貌似不是一定的。
4)透明的activity被调用之后,之前的activity会被pause,但是不会stop,而且之前的activity的surface也不会被destroy掉。
5)当从一个不透明的activity(C)回到一个透明的activity(B)之后,在透明的activity之下的activity(A)也会和B一起被restart起来。
6)从目前这个情况来看,在Android的很多activity的跳转来看,貌似不是很适合使用某种类型singlton类在项目中。特别是有状态控制的那种。例如camera。
7)另外,我理解startActivityForResult(...)和startActivity()之间在对Activity的生命周期和调用序列上没有太多的区别。唯一区别在于使用前者时,在回到本Activity时,会调用onActivityResult()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值