后退按钮卡在无限循环中?

时间:2013-02-12 22:59:32

标签: android

我的应用程序目前停留在物理后退按钮的无限循环中。该程序设置为加载启动画面,然后转换到主菜单。一旦进入主菜单,用户就可以切换到他们选择的另一个活动。例如:新的游戏活动。一旦用户进入新的游戏活动,我希望他们能够点击后退按钮并将其带到主菜单。一旦回到主菜单,如果他们再次点击后退按钮,我希望它退出游戏。

这是我为每项活动使用的内容:

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

如果我第一次加载主菜单时按下后退按钮它将正常工作并关闭游戏。如果我之前点击后退按钮从一个屏幕进入主菜单,它只会搞砸。

更新

好的,那种工作。当我点击主屏幕上的后退按钮时,音乐停止,它就像试图关闭应用程序一样,但它会再次闪回主屏幕。我每次都要打两次。

3 个答案:

答案 0 :(得分:2)

您应该在活动的onKeyDown方法中调用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); 
}

答案 1 :(得分: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); 
}

答案 2 :(得分:0)

您还没有在其他活动中调用finish(),因此当您在菜单上调用finish()时,它会自行关闭而其他活动会曝光