2013-02-12 3 views
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); 
} 

Если я нажимаю кнопку назад, как только главное меню загружает первый раз, когда он будет работать должным образом и закрыть игру. Это только испортится, если я нажал кнопку «Назад» ранее, чтобы перейти с одного экрана на главное меню.

Обновление:

Хорошо, что это сработало. Когда я нажимаю кнопку «Назад» на главном экране, музыка останавливается, и она действует так, как будто она пытается закрыть приложение, но снова возвращается к главному экрану. Я должен ударить его дважды каждый раз.

+0

Если вы добавите 'return true;' в нижней части обоих операторов 'if', работает ли оно так, как ожидалось? – Eric

+0

возвращает true вместо возврата super.onKeyDown (keyCode, event); ? – Rhendar

+0

Нет. Оставьте 'super.onKeyDown' таким, какой он есть, и' return true; 'должно быть * внутри * операторов' if'. – Eric

ответ

2

Вы должны позвонить finish() внутри метода ваших действий, чтобы ваша текущая деятельность фактически удалялась из стека.

Что-то, как это должно работать:

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); 
} 
0

Вы не вызвали finish() в ваших других мероприятиях, с тем, когда вы звоните finish() в меню она просто закрывается сама, а другая деятельность подвергается

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_TOP (или, возможно, Intent.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); 
}