Android活动中的多个onStop / onResume调用

时间:2017-05-27 20:11:08

标签: android android-activity android-orientation

背景

将我的应用程序置于后台(在我的Android手机上的其他位置导航)时,onStop()会被调用一次,就像预期的那样(Activity lifecycle

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

问题

为什么,如果我在我的应用程序活动中锁定手机(单按电源按钮) - 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  

当活动正在运行时,我会在应用程序的其他位置导航:

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

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

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

不确定它是否相关,但活动使用VLC库播放视频。无论视频当前是否正在播放,都会获得相同的结果。

更新

AndroidManifest.xml中的我的活动定义为android:screenOrientation="sensorLandscape"。删除属性后,问题将消失(android:screenOrientation="unspecified")。

1 个答案:

答案 0 :(得分:1)

指出了正确的问题by David Wasser

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

我的应用程序依赖于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);
}