4

私のアプリは現在、物理的な戻るボタンで無限ループに陥っています。プログラムは、スプラッシュ画面をロードしてからメインメニューに移行するように設定されています。メインメニューに入ると、ユーザーは選択した別のアクティビティに切り替えることができます。例:新しいゲームアクティビティ。ユーザーが新しいゲームアクティビティに参加したら、戻るボタンを押してメインメニューに移動できるようにします。メインメニューに戻ったら、もう一度戻るボタンを押すと、ゲームを終了します。

これは私が各活動に使用しているものです:

public boolean onKeyDown(int keyCode, KeyEvent event) {

    if ((keyCode == KeyEvent.KEYCODE_BACK)) { 
        startActivity(new Intent(NewGameActivity.this, MenuActivity.class));
    }
    return super.onKeyDown(keyCode, event); 
}   

これは正しく機能し、ユーザーを問題なくメインメニューに戻します。ただし、ユーザーがメインメニューでもう一度戻るボタンを押すと、エスケープしたばかりの画面に移動します。そのため、毎回前の画面にループバックします。

メインメニューの設定方法は次のとおりです。

public boolean onKeyDown(int keyCode, KeyEvent event) {

    if ((keyCode == KeyEvent.KEYCODE_BACK)) { 
        stopService(new Intent(MenuActivity.this, BGMusicService.class));
        MenuActivity.this.finish();
    }
    return super.onKeyDown(keyCode, event); 
}   

メインメニューが最初にロードされたらすぐに戻るボタンを押すと、正しく機能してゲームを閉じます。以前に戻るボタンを押して1つの画面からメインメニューに移動した場合にのみ、混乱します。

アップデート:

さて、そのようなものはうまくいきました。メイン画面の戻るボタンを押すと、音楽が停止し、アプリを閉じようとしているように動作しますが、再びメイン画面にフラッシュバックします。毎回2回叩かなければなりません。

4

3 に答える 3

2

現在のアクティビティが実際にスタックから削除されるように、アクティビティfinish()のメソッド内を呼び出す必要があります。onKeyDown

このようなものが機能するはずです:

public boolean onKeyDown(int keyCode, KeyEvent event)
{
  if (keyCode == KeyEvent.KEYCODE_BACK)
  { 
    startActivity(new Intent(NewGameActivity.this, MenuActivity.class));
    finish();
  }

  return super.onKeyDown(keyCode, event); 
}
于 2013-02-13T00:10:36.467 に答える
1

最初に(コメントから)ステートメントreturn true;内に(イベントを処理したことを示すために)次のように追加します。if

// Main menu code
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
        stopService(new Intent(MenuActivity.this, BGMusicService.class));
        MenuActivity.this.finish();
        return true; // Add me!
    }
    return super.onKeyDown(keyCode, event); 
}

さらに、メニューアクティビティを再度「開始」しているため、開く前にバックスタック(これまでに使用されたアクティビティの順序)をクリアする必要があると思います。(または多分)を使用してこれを達成できるはずです。このようなもの:Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_CLEAR_TASK

// Other activity code
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        Intent menuIntent = new Intent(NewGameActivity.this, MenuActivity.class);
        menuIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // Add me!
        startActivity(menuIntent);
        return true; // Add me, too!
    }
    return super.onKeyDown(keyCode, event); 
}
于 2013-02-13T17:39:47.887 に答える
0

他のアクティビティを呼び出していないfinish()ため、メニューを呼び出すfinish()と、メニューが閉じて他のアクティビティが表示されます。

于 2013-02-13T00:11:06.060 に答える