gpt4 book ai didi

android - Android Activity 中的多个 onStop/onResume 调用

转载 作者:行者123 更新时间:2023-11-29 01:09:35 25 4
gpt4 key购买 nike

背景

当将我的应用程序置于后台(在我的 Android 手机上导航到其他地方)时,onStop() 被调用一次,正如预期的那样 ( Activity lifecycle )

问题原因:onStop() 包含开发人员希望运行一次的代码。

问题

为什么,如果我在我的应用程序 Activity 期间锁定我的手机(按一次电源按钮)- onStop() 被调用 3 次?

更新

案例#1

05-28 14:06:29.322 24347-24347/com... D/DEBUG: onCreate
05-28 14:06:29.380 24347-24347/com... D/DEBUG: onStart
05-28 14:06:29.380 24347-24347/com... D/DEBUG: onResume

当 Activity 正在运行时,我在应用之外的其他地方导航:

05-28 14:06:31.954 24347-24347/com... D/DEBUG: onStop  

此时我导航回应用程序并打开它:

05-28 14:06:34.314 24347-24347/com... D/DEBUG: onStart
05-28 14:06:34.314 24347-24347/com... D/DEBUG: onResume

案例#2

05-28 14:09:01.411 24347-24347/com... D/DEBUG: onCreate
05-28 14:09:01.453 24347-24347/com... D/DEBUG: onStart
05-28 14:09:01.453 24347-24347/com... D/DEBUG: onResume

此时我锁定我的设备:

05-28 14:35:55.017 30961-30961/com... D/DEBUG: onStop
05-28 14:35:55.278 30961-30961/com... D/DEBUG: onDestroy
05-28 14:35:55.367 30961-30961/com... D/DEBUG: onCreate
05-28 14:35:55.411 30961-30961/com... D/DEBUG: onStart
05-28 14:35:55.419 30961-30961/com... D/DEBUG: onResume
05-28 14:35:55.440 30961-30961/com... D/DEBUG: onStop
05-28 14:35:55.441 30961-30961/com... D/DEBUG: onDestroy
05-28 14:35:55.451 30961-30961/com... D/DEBUG: onCreate
05-28 14:35:55.493 30961-30961/com... D/DEBUG: onStart
05-28 14:35:55.502 30961-30961/com... D/DEBUG: onResume
05-28 14:35:55.830 30961-30961/com... D/DEBUG: onStop
05-28 14:35:55.969 30961-30961/com... D/DEBUG: onDestroy
05-28 14:35:56.004 30961-30961/com... D/DEBUG: onCreate
05-28 14:35:56.044 30961-30961/com... D/DEBUG: onStart
05-28 14:35:56.052 30961-30961/com... D/DEBUG: onResume

我解锁它以查看仍然存在的 Activity :

05-28 14:39:38.225 30961-30961/com... D/DEBUG: onResume
05-28 14:39:38.415 30961-30961/com... D/DEBUG: onStop
05-28 14:39:38.416 30961-30961/com... D/DEBUG: onDestroy
05-28 14:39:38.465 30961-30961/com... D/DEBUG: onCreate
05-28 14:39:38.610 30961-30961/com... D/DEBUG: onStart
05-28 14:39:38.624 30961-30961/com... D/DEBUG: onResume

不确定是否相关,但该 Activity 使用 VLC 库播放视频。无论视频当前是否正在播放,都会达到相同的结果。

更新

我的 Activity ,在 AndroidManifest.xml 中是用 android:screenOrientation="sensorLandscape" 定义的。删除该属性后问题就会消失 (android:screenOrientation="unspecified")。

最佳答案

指出了正确的问题by David Wasser

Activity被销毁并重新创建的原因类似于改变方向
我的 Activity 使用的是 android:screenOrientation="sensorLandscape",我不知道在销毁 Activity 时“方向”可能会改变。

我的应用程序同时依赖于 onStop() 和 onResume() 调用,因此我将实现 onResume(),因为它们很相似。

解决方案基于Saving the Instance State

private boolean onResumeCalledAlready;
private String ON_RESUME_CALLED_PREFERENCE_KEY = "onResumeCalled";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Record onResume not called yet
if (savedInstanceState != null) {
// Restore value of members from saved state
onResumeCalledAlready = savedInstanceState.getBoolean(ON_RESUME_CALLED_PREFERENCE_KEY);
} else {
onResumeCalledAlready = false;
}
}

@Override
protected void onResume() {
super.onResume();
if (!onResumeCalledAlready) {
onResumeCalledAlready = true;
// Do once
callMeOnlyOnce();
}
// Everything else might be called multiple times
}

@Override
protected void onSaveInstanceState(Bundle outState) {
// Save current onResumeCalledAlready state
outState.putBoolean(ON_RESUME_CALLED_PREFERENCE_KEY, onResumeCalledAlready);
super.onSaveInstanceState(outState);
}

关于android - Android Activity 中的多个 onStop/onResume 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44221195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com