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

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

更新:

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

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_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); 
}
于 2013-02-13T17:39:47.887 回答
0

您还没有调用finish()其他活动,因此当您调用finish()菜单时,它只会自行关闭,而其他活动会暴露出来

于 2013-02-13T00:11:06.060 回答