2016-05-15 14 views
0

私のアプリケーションには、現在のところ起動画面とゲーム中の2つのアクティビティがあります。バックグラウンドだけの起動画面とPlayボタン。再生ボタンを押すと、問題なく正常に動作するInGameActivityが起動します。しかし、ゲーム中にbackボタンを押すと、前の画面に戻ります(背景とPlayボタンが表示されます)が、アプリケーションは応答しません。数秒後、応答または終了を待機するように尋ねるエラーメッセージがポップアップ表示されます。戻るボタンによってアプリケーションが応答を停止する

ゲームでは、スレッドを使用して一貫した30 FPSを維持し、ドローコールを制御します。私の最善の賭けは、問題や何かが原因で、AndroidManifest.xmlから欠落しているスレッドですが、私は非常に混乱しています。私がインターネット上で見つけたことは、戻るボタンがめったに問題を引き起こさず、をonPause()から、またはonBackPressed()から呼び出して、それを処理する必要があることを示唆しています。

解決策:onBackPressed()が呼び出されたときにスレッドを終了すると、問題が解決しました。

public class MainActivity extends Activity { 

    ImageButton play; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     setContentView(R.layout.title); 

     play = (ImageButton)findViewById(R.id.title_screen_play_button); 
     play.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       System.out.println("Play button pressed!"); 
       Intent intent = new Intent(getApplicationContext(), InGameActivity.class); 
       startActivity(intent); 
      } 
     }); 
    } 
} 

、ゲーム内のアクティビティ:MainActivity

public class InGameActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     System.out.println("In game activity created"); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 

     //The GamePanel controls the entire game. It extends SurfaceView and implements SurfaceHolder.Callback 
     GamePanel gamePanel = new GamePanel(this, metrics.widthPixels, metrics.heightPixels, getResources()); 
     setContentView(gamePanel); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     System.out.println("Pausing game activity"); 

     finish(); 
    } 

} 

と活動私AndroidManifest.xml

<activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <activity android:name=".InGameActivity"/> 

あなたの助けに感謝し、読むために時間を割いてこの。

追加コードが必要な場合は教えてください。

+0

onPauseのfinish()を呼び出すこともできますが、AndroidManifest.xmlのアクティビティタグにandroid:noHistory = "true"を追加することもできます。 – Rafal

+0

'onBackPressed()'のデフォルトの動作を変更しない限り、 'onPause()'から 'finish()'を呼び出すことは不要です。 InGameActivityが終了したときに30fpsスレッドを終了しますか? – adelphus

+0

adelphusはい問題は、スレッドを終了するメソッドのバグであった。ご回答いただきありがとうございます。私はfinish()も不要なので削除しました。 –

答えて

0

onBackPressed()が呼び出されたときにスレッドを終了すると、問題が解決されました。

関連する問題