タイトルがすべてを物語っています。戻るボタンまたはホーム ボタンが押されたのではなく、方向が変更されたために onPause() が呼び出されていることをどのように確認できますか?
5 に答える
代わりにこれを行うことで、問題を完全に回避しました。
onPause の代わりに onWindowFocusChanged イベントを使用できます。この関数は、向きが変更されたときに呼び出されません。
@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();
}
onPause の呼び出し方法を区別することはできません。あなたができることは、onKeyDown
戻るボタンとホームボタンのキーイベントをオーバーライドして探すことができるということです。
戻る/ホーム ボタンの押下をマークするフラグを用意し、onPause() でこのフラグを確認します。このフラグが設定されていない場合、onPause は向き変更の cos と呼ばれます。ただし、電話やアラームにより、アプリがバックグラウンドに移動する可能性があります。したがって、完璧な解決策ではないかもしれません。
もう 1 つの解決策は、方向の変化を追跡することです。onConfigurationChanged
おそらく onPause の代わりに onSaveInstanceState が必要です
これらは同様の機能を提供しますが、ユーザーがアクティビティを取り消すときに onSaveInstanceState は呼び出されません。
http://developer.android.com/reference/android/view/OrientationEventListener.html これは機能するはずです。これで乾杯しませんか。
できません。そのような単純な。ただし、再度 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);
}
上記のコードは、約 4 万台のデバイスで実行されており、確実に動作します。