2

标题说明了一切。我如何判断 onPause() 何时因为方向变化而不是按下后退或主页按钮而被调用?

4

5 回答 5

1

我通过这样做完全避免了这个问题:

您可以使用 onWindowFocusChanged 事件而不是 onPause。方向改变时不调用此函数。

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    Log.d(TAG, "FOCUS = " + hasFocus);
    if (!hasFocus) finish();
}

但请注意:当活动仍然可见时调用此事件(如 onPause()),如果要在活动真正完全不可见时完成活动,则应使用 onStop:

private boolean isInFocus = false;

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    Log.d(TAG, "FOCUS = " + hasFocus);
    isInFocus = hasFocus;
}

@Override
public void onStop() {
    super.onStop();
    if (!isInFocus) finish();
}
于 2013-10-17T03:10:11.943 回答
0

您无法区分如何调用 onPause。您可以做的是,您可以覆盖onKeyDown并查找后退按钮和主页按钮键事件。

有一个标记返回/主页按钮按下的标志,并在 onPause() 中检查此标志。如果未设置此标志,则 onPause 称为方向变化的余数。但是,您的应用程序有可能由于电话或警报而被移至后台!所以可能不是一个完美的解决方案。

另一种解决方案是跟踪方向变化onConfigurationChanged

于 2013-10-16T23:08:46.807 回答
0

您可能想要 onSaveInstanceState 而不是 onPause

它们提供类似的功能,但当用户退出活动时不会调用 onSaveInstanceState。

于 2013-10-17T01:05:07.243 回答
0

http://developer.android.com/reference/android/view/OrientationEventListener.html 这应该可以。你为什么不为此干杯。

于 2013-10-17T01:14:47.297 回答
-2

你不能。就那么简单。但是,您可以通过读取显示配置来测量再次达到 onResume 所需的时间以及设备是否倾斜。

3 秒的间隔有点合理,对于速度较慢的设备也是如此。

以下是我们使用的相关部分:

protected void onCreate() {
  ...
  orientation = getResources().getConfiguration().orientation;
}

protected void onResume() {
  ...
  long time = SystemClock.elapsedRealtime() - pauseTime;
  int o = getResources().getConfiguration().orientation;
  Log.d(TAG, "pauseTime: " + pauseTime + " System: " + SystemClock.elapsedRealtime() + " elapsed pause time: " + time + " orientation now: " + o + " orientation then: " + orientation);
  if (time < 3000 && o != orientation) {
    // device was turned
  }
  orientation = o;
}

protected void onPause() {
  ...
  pauseTime = SystemClock.elapsedRealtime();
}

protected void onSaveInstanceState(final Bundle outState) {
  ...
  outState.putLong(PAUSE_TIME, pauseTime);
  outState.putInt(ORIENTATION, orientation);
}

protected void onRestoreInstanceState(final Bundle savedInstanceState) {
  ...
  pauseTime = savedInstanceState.getLong(PAUSE_TIME, -1);
  orientation = savedInstanceState.getInt(ORIENTATION, -1);
}

上面的代码在大约 40k 设备上运行并且可靠地工作。

于 2013-10-17T00:44:47.913 回答