2017-09-23 47 views
0

我正在Android Studio中进行一个简单的游戏,并且我正在调用GameOver活动,并且再次尝试按钮形式的游戏活动(它只是名为MainActivity)。当主角与其中一个怪物发生碰撞时被调用。我的问题是,当我尝试以((Activity)getContext()).finish();完成时,我的应用程序关闭,而不是开始新的活动。这是启动它的方法:为什么我的应用程序在从自定义视图启动Activity后关闭?

public void isCharacterDead(){ 
    for (Monster item : monsters) { 
     if (characters.get(0).deadCollision.contains(item.collision.centerX(), item.collision.centerY())) { 
      player.stop(); 
      long gameOverDelayEnd = (System.nanoTime()/1000000)+1000; 
      long gameOverDelayStart = System.nanoTime()/1000000; 

      while(gameOverDelayStart < gameOverDelayEnd){ 
       gameOverDelayStart = System.nanoTime()/1000000; 

       } 
      characters.remove(0); 

      Intent gameOver = new Intent(getContext(),GameOver.class); 
      gameOver.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      ((Activity)getContext()).finish(); 
      getContext().startActivity(gameOver); 

      } 
    } 
} 

而且我GAMEOVER活动是:

public class GameOver extends Activity { 
    private Button tryAgain; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     //removing the title from the screen in order to have empty screen 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
     setContentView(R.layout.activity_game_over); 

     tryAgain = (Button) findViewById(R.id.tryagain); 
     tryAgain.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent game = new Intent(GameOver.this, MainActivity.class); 
       GameOver.this.finish(); 

       startActivity(game); 

      } 
     }); 
    } 
} 

现在,如果我不使用((Activity)getContext()).finish();,它开始在GAMEOVER活动,当再次尝试点击我移动到游戏活动的新实例(MainActivity)。但它会通过GameOver中的“再试一次”按钮来降低每次新开始时的性能。我想这是因为在没有完成最后一场比赛的情况下开始新的比赛活动。有关如何避免这种情况的任何建议?作为例外,android监视器内没有任何内容(我的GPU监视器也被禁用)。

+0

为什么要使用Intent.FLAG_ACTIVITY_NEW_TASK并在写你的代码? getContext()方法如何工作? – ammcom

+0

isCharacterDead()位于自定义视图内。在每个精灵位置的帧更新后调用它。 –

回答

0

尝试交换这两行:

((Activity)getContext()).finish(); 
getContext().startActivity(gameOver); 

当你启动活动

编辑不要忘记breakfor循环:

编辑您的问题将您的完整代码后现在明确你的问题的原因 :

你正在调用th e方法upd反过来调用方法isCharacterDead来完成活动,但不允许从UI线程以外的任何线程访问任何UI元素。

可以使用runOnUiThread解决它:

替换活动开始的线,并停止目前有以下几点:

((Activity)getContext()).runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
       Intent gameOver = new Intent(getContext(),GameOver.class); 
       gameOver.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       getContext().startActivity(gameOver); 
       ((Activity)getContext()).finish(); 
     } 
}); 
+0

我交换了它们,但它仍然是一样的 - 应用程序自动关闭,没有任何消息或任何东西。如果我没有完成从GameOver每次新开始的活动,则性能会在仿真器上破坏,在真实设备上它甚至会在第四次使用时关闭应用程序。如果更清楚,MainActivity启动GameScreen视图,在该视图中我将该问题显示为GameOver活动。 –

+0

如果它的事项我的清单看起来像这样: '<活动机器人:名字= “GameActivity。 ”> <意图过滤器> <操作机器人:名字=“ android.intent.action.MAIN”/> <类别机器人:名称= “android.intent.category.LAUNCHER”/> <活动 机器人:名称= “MainActivity。” 机器人:主题=“@机器人:风格/主题。半透明“> ' –

+0

您可以发布logcat的,以便我们能够帮助您更好地 – ammcom

相关问题