标题说明了一切。我如何判断 onPause() 何时因为方向变化而不是按下后退或主页按钮而被调用?
问问题
286 次
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
于 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 回答