Java 在游戏中退出时造成的强制关闭

Java 在游戏中退出时造成的强制关闭,java,android,Java,Android,我尝试了很多方法来解决这个问题。最新的是使home按钮和back按钮执行onDestroy();并完成() 基本上,当我在游戏中退出游戏时,它就会退出(声音还会继续播放几分钟,不知道该怎么办)。但当我点击重新进入游戏时,一个强制关闭弹出。单击后,它将再次工作。但我想让它在退出游戏时,它摧毁一切,使它成为一个全新的游戏。或者,如果能阻止游戏以这种方式强行关闭,那么当主打或后卫被击中时暂停游戏也可以。我尝试将返回和主页按钮指定为暂停,并尝试了onDestroy();并完成();还有它 使用的代码如下

我尝试了很多方法来解决这个问题。最新的是使home按钮和back按钮执行onDestroy();并完成()

基本上,当我在游戏中退出游戏时,它就会退出(声音还会继续播放几分钟,不知道该怎么办)。但当我点击重新进入游戏时,一个强制关闭弹出。单击后,它将再次工作。但我想让它在退出游戏时,它摧毁一切,使它成为一个全新的游戏。或者,如果能阻止游戏以这种方式强行关闭,那么当主打或后卫被击中时暂停游戏也可以。我尝试将返回和主页按钮指定为暂停,并尝试了onDestroy();并完成();还有它

使用的代码如下所示:

if(keyCode == onKeyDown(int keyCode, KeyEvent event){
    if (keyCode == KeyEvent.KEYCODE_BACK){
       onDestroy();
       finish();
     }
    return super.onKeyDown(keyCode, event);
 }
我是从一本书上抄的。我也换了钥匙回到家里,两个似乎都不起作用

我还尝试使用onDestroy();并完成();试图在游戏结束后重新设置游戏,但这不起作用。顺便说一句,所有这些都必须在调用surfaceview的类中进行编码,因为它在surfaceview中不起作用

如有任何帮助,我们将不胜感激。谢谢

编辑

//若(完){ //onDestroy(); //完成(); // } }

}

这就是代码中的样子。老实说,我在编程方面是垃圾,所以我真的不使用debug,因为它让我很困惑,所以我不知道如何找到您要求的异常。是的,我意识到如果有人这么想的话,我需要学会使用debug

还有,如果有人对如何让我的静音设备工作有任何意见。我试过了,但没用

public class PlayGame extends Activity{

private static long pauseStartTime;
boolean mute=false;
GameView gameView;
Main main;


 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(new GameView(this));

        mute = main.mute;
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu){
   MenuInflater inflater = getMenuInflater();
   inflater.inflate(R.menu.menu, menu);
   return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
    case R.id.newgame:  
        Intent game = new Intent(PlayGame.this, Main.class);
        startActivity(game);
    break;
    case R.id.pause:

        if(GameView.gameState == 0){
            GameView.gameState=2;
            pauseStartTime = System.currentTimeMillis();

        }
        else if (GameView.gameState == 2){
            GameView.gameState=0;

            long deltaTime = System.currentTimeMillis()-pauseStartTime;

            GameView.spawnZom1Time+=deltaTime;
            GameView.spawnZom2Time+=deltaTime;
            GameView.spawnZom3Time+=deltaTime;
            GameView.spawnSurvTime+=deltaTime;

        }


    break;
    case R.id.mute: 
        if (mute || main.mute){
            mute = false;
            Toast.makeText(this, "Game Unmuted", Toast.LENGTH_LONG).show();
        }
        else if (mute == false || main.mute == false){
            mute = true;
            Toast.makeText(this, "Game Muted", Toast.LENGTH_LONG).show();
        }
    break;
    }
    return true;
 }

}

您正在调用
onDestroy()
两次,一次显式调用,另一次使用
finish()间接调用

从方法中删除该行:

if(keyCode == onKeyDown(int keyCode, KeyEvent event){
    if (keyCode == KeyEvent.KEYCODE_BACK){
       finish();
     }
    return super.onKeyDown(keyCode, event);
 }
请看一下:

onDestroy()

在活动被销毁之前调用。这是活动将收到的最后一个呼叫。调用它可能是因为活动正在完成(有人对其调用finish()),也可能是因为系统正在临时销毁活动的此实例以节省空间。可以使用isFinishing()方法区分这两种情况

现在,重读一遍,我对什么时候有例外感到困惑:是退出(如标题所示)还是重新加载(如文本所示)


在任何情况下,我强烈建议您停止编码,并花时间阅读以下内容:

请粘贴您得到的异常和准确的代码。粘贴的内容不会编译。嗯,好吧,您不应该直接调用onDestroy()、onPause()等。它们是Android的系统回调。很可能您正在onCreate中初始化一些重要变量。将变量初始化移动到onResume或onStart。放入代码和异常。。否则它将是猜测。。。
public class PlayGame extends Activity{

private static long pauseStartTime;
boolean mute=false;
GameView gameView;
Main main;


 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(new GameView(this));

        mute = main.mute;
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu){
   MenuInflater inflater = getMenuInflater();
   inflater.inflate(R.menu.menu, menu);
   return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
    case R.id.newgame:  
        Intent game = new Intent(PlayGame.this, Main.class);
        startActivity(game);
    break;
    case R.id.pause:

        if(GameView.gameState == 0){
            GameView.gameState=2;
            pauseStartTime = System.currentTimeMillis();

        }
        else if (GameView.gameState == 2){
            GameView.gameState=0;

            long deltaTime = System.currentTimeMillis()-pauseStartTime;

            GameView.spawnZom1Time+=deltaTime;
            GameView.spawnZom2Time+=deltaTime;
            GameView.spawnZom3Time+=deltaTime;
            GameView.spawnSurvTime+=deltaTime;

        }


    break;
    case R.id.mute: 
        if (mute || main.mute){
            mute = false;
            Toast.makeText(this, "Game Unmuted", Toast.LENGTH_LONG).show();
        }
        else if (mute == false || main.mute == false){
            mute = true;
            Toast.makeText(this, "Game Muted", Toast.LENGTH_LONG).show();
        }
    break;
    }
    return true;
 }
if(keyCode == onKeyDown(int keyCode, KeyEvent event){
    if (keyCode == KeyEvent.KEYCODE_BACK){
       finish();
     }
    return super.onKeyDown(keyCode, event);
 }