Activity生命周期,学习笔记(踩过的坑)

Posted 夜尽天明89

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activity生命周期,学习笔记(踩过的坑)相关的知识,希望对你有一定的参考价值。

关于Activity的生命周期问题,已经是很常见、很简单的问题了,但是偶尔还是会踩坑。这里,做个总结、笔记

1、一个APP启动,启动后退到后台(home键),然后重新打开界面。这个过程是生命周期变化是什么?

这个问题非常简单了

APP启动
onCreate
onStart
onResume

退到后台
onPause
onStop

重新打开
onRestart
onStart
onResume

2、两个界面的跳转呢?
第一个界面,跳转第二个界面startActivityForResult,然后关闭第二个界面,回到第一个界面setResult、finish()

打开APP,展示第一个界面
第一个界面: onCreate
第一个界面: onStart
第一个界面: onResume

跳转第二个界面
15:59:24.062 第一个界面: onPause
15:59:24.101 第二个界面: onCreate
15:59:24.104 第二个界面: onStart
15:59:24.105 第二个界面: onResume
15:59:24.522 第一个界面: onStop

关闭第二个界面,回到第一个界面
16:00:48.703 第二个界面: onPause
16:00:48.718 第一个界面: onActivityResult ; requestCode = 1 ; resultCode = 2
16:00:48.719 第一个界面: onRestart
16:00:48.720 第一个界面: onStart
16:00:48.720 第一个界面: onResume
16:00:49.117 第二个界面: onStop
16:00:49.118 第二个界面: onDestroy

注意:
1、第一个界面的onStop,是在第二个界面展示后,大约400毫秒以后(这里,我的demo是空界面,具体时间,可能和界面复杂度有关)
2、第二个界面回到第一个界面时,onActivityResult 先于onResume处理

为什么呢?看下 onActivityResult 的源码,这个方法上的说明:

......
......

<p>You will receive this call immediately before onResume() when your
activity is re-starting.
你将在onResume()之前立即收到这个电话,当你的
活动重新开始。

<p>This method is never invoked if your activity sets
@link android.R.styleable#AndroidManifestActivity_noHistory noHistory to
<code>true</code>.

 ......
 ......

假设现在有个功能需求1:
1、在A界面,有个单词读音功能,要求在界面停止的时候,关闭读音;
2、A界面上,有个按钮,去到B界面,B界面上有个单词,要求界面展示后自动发音。

分析:
1、A界面,界面停止时关闭读音,在 onStop 的时候关闭读音;
2、隐藏条件:项目中,读音控制器,是单例的,只有一个。即:单词A发音时,B单词读音前触发了关闭条件,A单词读音立刻停止

如果功能开发时:
A界面单词正在读音,在A的 onStop 中进行了cancel 操作;跳转到了B界面,B界面单词自动发音,会出现B界面没有读音效果问题。原因就是,A界面的onStop,在B的onResume后执行,B单词正在发音的时候,A把它关了。

解决办法:
B单词界面读音时:

view?.postDelayed(
	......
, long delayMillis)

delayMillis:毫秒值

延迟一点时间后,再执行相关功能

以上是关于Activity生命周期,学习笔记(踩过的坑)的主要内容,如果未能解决你的问题,请参考以下文章

实施自动化测试项目的7大必备条件!那些我踩过的坑......

Fragment全解析系列:那些年踩过的坑

Swift5 踩过的坑和奇怪的API笔记

Swift5 踩过的坑和奇怪的API笔记

Swift5 踩过的坑和奇怪的API笔记

Activity 学习笔记02-生命周期