2016-05-15 6 views
0

Мое приложение имеет два действия на данный момент, экран запуска и действия в игре. Экран запуска, который представляет собой не что иное, как фон и кнопку 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"/> 

Цените вашу помощь и нашли время, чтобы прочитать это.

Дайте мне знать, если вам нужен дополнительный код.

+0

вызов finish() in onPause является одним из вариантов, но вы также можете добавить android: noHistory = "true" в свой тег активности в AndroidManifest.xml. – Rafal

+0

Вызов 'finish()' from' onPause() 'не требуется, если вы не изменяете поведение по умолчанию' onBackPressed() '. Вы заканчиваете свой поток 30fps, когда заканчивается «InGameActivity»? – adelphus

+0

adelphus да проблема была с ошибкой в ​​методе для завершения потока. Благодарю за ваш ответ. Я также удалил finish(), поскольку он не нужен, и теперь все работает отлично. –

ответ

0

Завершение нити, когда onBackPressed() называется решением проблемы.