Мое приложение имеет два действия на данный момент, экран запуска и действия в игре. Экран запуска, который представляет собой не что иное, как фон и кнопку Play
. Нажатие кнопки воспроизведения запускает InGameActivity
, который работает нормально без проблем. Однако, когда я нажимаю кнопку back
, в то время как в игре он возвращается к предыдущему экрану (видны фон и кнопка), но приложение не отвечает. Через несколько секунд появится сообщение об ошибке, требующее, чтобы он ответил или прекратил действие.Задняя кнопка Заставляет приложение останавливать ответ
В игре я использую поток для поддержания согласованного 30 FPS, и он управляет вызовами рисования. Моя лучшая ставка - на тему, вызывающую проблемы или что-то недостающее в AndroidManifest.xml
, но я очень смущен. Все, что я нашел в Интернете, говорит о том, что кнопка «назад» редко вызывает проблемы, а вызов finish()
от onPause()
или от onBackPressed()
должен позаботиться об этом, но это не так.
РЕШЕНИЕ: Завершение нити, когда onBackPressed() называется решением проблемы.
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);
}
});
}
}
И в игре активность:
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"/>
Цените вашу помощь и нашли время, чтобы прочитать это.
Дайте мне знать, если вам нужен дополнительный код.
вызов finish() in onPause является одним из вариантов, но вы также можете добавить android: noHistory = "true" в свой тег активности в AndroidManifest.xml. – Rafal
Вызов 'finish()' from' onPause() 'не требуется, если вы не изменяете поведение по умолчанию' onBackPressed() '. Вы заканчиваете свой поток 30fps, когда заканчивается «InGameActivity»? – adelphus
adelphus да проблема была с ошибкой в методе для завершения потока. Благодарю за ваш ответ. Я также удалил finish(), поскольку он не нужен, и теперь все работает отлично. –