私のアプリケーションには、現在のところ起動画面とゲーム中の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"/>
あなたの助けに感謝し、読むために時間を割いてこの。
追加コードが必要な場合は教えてください。
onPauseのfinish()を呼び出すこともできますが、AndroidManifest.xmlのアクティビティタグにandroid:noHistory = "true"を追加することもできます。 – Rafal
'onBackPressed()'のデフォルトの動作を変更しない限り、 'onPause()'から 'finish()'を呼び出すことは不要です。 InGameActivityが終了したときに30fpsスレッドを終了しますか? – adelphus
adelphusはい問題は、スレッドを終了するメソッドのバグであった。ご回答いただきありがとうございます。私はfinish()も不要なので削除しました。 –