Meine Anwendung verfügt im Moment über zwei Aktivitäten, einen Startbildschirm und eine In-Game-Aktivität. Der Startbildschirm, der nichts als ein Hintergrund und eine Play
Taste ist. Durch Drücken der Wiedergabetaste wird die InGameActivity
gestartet, die einwandfrei funktioniert. Wenn ich jedoch im Spiel die Taste back
drücke, wird zum vorherigen Bildschirm zurückgekehrt (der Hintergrund und die Schaltfläche Play
sind sichtbar), aber die App reagiert nicht. Nach einigen Sekunden erscheint eine Fehlermeldung, in der Sie darauf warten müssen, dass die Nachricht antwortet oder beendet wird.Zurück-Taste bewirkt, dass Anwendung nicht mehr reagiert
Im Spiel benutze ich einen Thread, um eine konsistente 30 FPS aufrechtzuerhalten und es steuert die Zeichenaufrufe. Meine beste Wette ist auf den Thread verursacht Probleme oder etwas fehlt in der AndroidManifest.xml
, aber ich bin sehr verwirrt. Alles, was ich im Internet gefunden habe, deutet darauf hin, dass die Zurück-Taste selten Probleme verursacht und finish()
von onPause()
oder onBackPressed()
anrufen sollte sich darum kümmern, aber es hat nicht.
LÖSUNG: Das Beenden des Threads beim Aufruf von onBackPressed() löste das Problem.
Die MainActivity
:
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);
}
});
}
}
Und das in der Spielaktivität:
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();
}
}
Und die Aktivitäten in meinem 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"/>
Schätzen Sie Ihre Hilfe und die Zeit nehmen, zu lesen Dies.
Lassen Sie mich wissen, wenn zusätzlicher Code benötigt wird, um zu helfen.
Das Aufrufen von finish() in onPause ist eine Option, aber Sie können Ihrem Activity-Tag in AndroidManifest.xml auch android: noHistory = "true" hinzufügen. – Rafal
Der Aufruf von 'finish()' aus 'onPause()' ist nicht notwendig, es sei denn, Sie ändern das Standardverhalten von 'onBackPressed()'. Beenden Sie Ihren 30fps-Thread, wenn "InGameActivity" beendet ist? – adelphus
adelphus ja das Problem war mit einem Fehler in der Methode, den Thread zu beenden. Danke für Ihre Antwort. Ich habe auch finish() entfernt, da es unnötig ist und alles jetzt perfekt funktioniert. –