将我的应用程序置于后台(在我的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"
)。
答案 0 :(得分:1)
指出了正确的问题by David Wasser
活动被破坏和重新创建的原因类似于方向改变
我的活动是使用android:screenOrientation="sensorLandscape"
,我不知道"方向"在销毁活动时可能会改变。
我的应用程序依赖于onStop()和onResume()调用,所以我将实现onResume(),因为它们是相似的。
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);
}