关于Activity中onStop和onPause调用时机的各种误解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GBStyle/article/details/82759270

源码 : https://github.com/w-g-b/ActivityReview

正确结果

假设当前的FirstActivity为A,要调用A的onPause方法而不调用onStop方法

1. 在AndroidManifest文件中,将ThirdActivity(B)的theme属性设置为对话框样式(也可以使用自定义主题,也不必一定是对话框,也可以设置成透明样式的Activity)

2. 在A中通过startActivity启动B,这个时候就只会调用A的onPause方法,并会调用B的onCreate,onStart,onResume方法

3. 关闭B时,只会重新调用A的onResume方法

目前我的测试也就只有这种情况下才会只调用A的onPause方法,而不调用onStop方法

 而会调用onStop方法的情况则比较多,比如: 锁屏,按Home返回桌面,来电,或者像微信PC端请求登录时,客户端突然蹦出现的确定信息 ,都会调用onStop方法

有关onStop和onPause时机的各种误解

网上很多人说,当弹出对话框时会调用onPause方法或者说活动可见但被遮挡而不能交互时,会调用onPause,所以做了如下的测试,证明这种说法是错的

1. 当发生弹窗,或者弹吐司(Toast)的时候,并不会调用onPause方法

2. 当有新消息,比如说新短信提醒或者像微信那种新信息提示时,也不会调用onPause方法

3. 这个也是有利的证据,下拉Android系统自带的通知栏,此时当前Activity被遮挡,并且无法进行交互,但是仍然没有调用onPause方法

而关于onStop的说法是,当Activity不可见的时候会调用onStop方法,这里也举个反例。通过将对话框主题的Activity设置为全屏并且是可见的,观看打印结果

这里使用自定的对话框样式:

1. 在模块/src/main/res/values/styles.xml添加一个新的样式:

2. AndroidManifest中设置该theme

3. 代码中实现全屏

4. 如果说状态栏还在有影响,则可以添加如下代码,隐藏掉状态栏

5. 此时,启动该对话框样式的Activity则是全屏的,完全遮挡了后面的Activity

6. 此时的打印信息,仍只会调用前面那个Activity的onPause方法

 另外还有一种比较神奇的现象:就算是跳到其他页面,使得该Activity完全不可见,也不会调用该的onPause, onStop方法

1. 首先得是MIUI系统,其他系统我不清楚有没有这功能

2. 使用系统自带的截图功能截图,此时会截完图会出现一个缩略图在右上角展示

3. 点击缩略图跳转,进入图片处理界面,此时改界面完全遮盖了原有的Activity

4. 按返回键返回原来的界面

在这整个过程当中,并不会调用onPause或者onStop方法。

当然,如果你在图片处理界面点击了发送或者美化,才会开始调用原Activity的onPause和onStop方法

感觉网上的信息真的是太多太复杂了,不一定可信,还是需要自己亲自测试一下,才能验证结果。代码已上传,详解上面的github链接↑↑↑ 

猜你喜欢

转载自blog.csdn.net/GBStyle/article/details/82759270