首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android 10 -奇怪的活动生命周期

Android 10 -奇怪的活动生命周期
EN

Stack Overflow用户
提问于 2020-08-20 07:18:50
回答 5查看 1.1K关注 0票数 2

我有一个奇怪的问题发生在Android 10上,当我开始新的景观活动时,下面的活动将重新创建。

假设有两个Activity类:

代码语言:javascript
复制
ActivityA: orientation = unspecified
ActivityB: orientation = force landscape, full screen, opaque

如果我从ActivityB启动ActivityA,那么生命周期事件的日志:

代码语言:javascript
复制
D/ActivityA: onPause() called
D/ActivityB: onCreate() called
D/ActivityB: onStart() called
D/ActivityB: onResume() called
D/ActivityA: onStop() called
D/ActivityA: onDestroy() called
D/ActivityA: onCreate() called
D/ActivityA: onStart() called
D/ActivityA: onResume() called
D/ActivityA: onPause() called
D/ActivityA: onStop() called

可以清楚地看到ActivityA是重新创建的,而且ActivityA#onResume是在ActiviyB#onResume之后调用的?

好的,现在我们在堆栈的顶部有ActivityB,然后我按后退按钮:

代码语言:javascript
复制
D/ActivityB: onPause() called
D/ActivityA: onStart() called
D/ActivityA: onResume() called
D/ActivityA: onPause() called
D/ActivityA: onStop() called
D/ActivityA: onDestroy() called
D/ActivityA: onCreate() called
D/ActivityA: onStart() called
D/ActivityA: onResume() called
D/ActivityB: onStop() called
D/ActivityB: onDestroy() called

ActivityA又被重新创建了?

正如我在我的设备中所看到的那样,在ActivityA变得可见之前,ActivityB会旋转到横向模式,而当ActivityB退出时,ActivityA再次旋转回纵向模式。此行为可能导致ActivityA一次又一次地重新创建。

它会造成很多麻烦,你知道如何防止ActivityA在这种情况下重新创建吗,或者这是安卓本身的一个bug?

更新1

我可以很容易地在ActivityA上处理配置更改,问题是ActivityA有一个非常复杂的视图结构,重新创建它不必要地导致UI滞后,而且活动的生命周期回调混乱也会导致逻辑中断。

更新2

我刚刚发现recreate()方法被AppCompatDelegateImpl类调用了两次,这就是为什么我会得到奇怪的生命周期行为:

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-08-30 12:15:04

这看起来像是一个特定于设备的错误。

我在Pixel3a (API 29 & 30)模拟器上试用了您的代码。我得到的是:

ActivityB启动ActivityA的探讨

代码语言:javascript
复制
D/MainActivityA: onPause() called
D/MainActivityB: onCreate() called
D/MainActivityB: onStart() called
D/MainActivityB: onResume() called
D/MainActivityA: onStop() called

在后按钮按下:

代码语言:javascript
复制
D/MainActivityB: onPause() called
D/MainActivityA: onStart() called
D/MainActivityA: onResume() called
D/MainActivityB: onStop() called
D/MainActivityB: onDestroy() called

您应该使用适当的Android构建和使用的设备进行提出问题

关于问题中更新2的思考

日志显示正在调用onConfigurationChanged(Configuration)文档指出,将在运行时配置更改时重新创建活动。

您可以做的是在您的活动中重写onConfigurationChanged(Configuration),并记录配置对象,以查看哪些设备配置发生了更改。可能是OrientationScreen sizeScreenLayoutKeyboard availability

票数 1
EN

Stack Overflow用户

发布于 2020-08-21 21:13:56

也许你对这种行为无能为力。如果不给你带来太多的问题,我建议如下:

  • android:configChanges="orientation"添加到ActivityA的清单条目中
  • onConfigurationChanged()中实现ActivityA并自行处理方向更改

这将防止安卓在改变方向时杀死和重新创建ActivityA

票数 3
EN

Stack Overflow用户

发布于 2020-08-20 07:22:57

不仅仅是你面临这个问题(很多人都是),这是一个需要修复的错误,它不应该被破坏,我能知道你使用的是哪种设备吗?在评论中,你可能会说。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63500099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档