Как отличить, вызывается ли onDestroy () как часть последовательности изменения конфигурации?

В моей деятельности в onDestroy () необходимо уничтожить какую-то внешнюю вещь (услугу). Но я не хочу этого, когда происходит изменение конфигурации (например, клавиатура переливается), потому что он будет восстановлен сразу.

Поэтому возникает вопрос: как отличить, вызвано ли onDestroy () нажатием клавиши Back-key или частью процесса изменения конфигурации?

После ответа @ CommonsWare было бы довольно просто) что-то вроде:

@Override onDestroy() { if (mIsChangeConfig == true) { mIsChangeConfig = false: } else { stopService(); } } @Override onRetainNonConfigurationInstance() { mIsChangeConfig = true; } 

Solutions Collecting From Web of "Как отличить, вызывается ли onDestroy () как часть последовательности изменения конфигурации?"

В Android 3.x (уровень API 11) вы можете вызвать isChangingConfigurations() чтобы узнать, уничтожается ли активность из-за изменения конфигурации.

До этого переопределите onRetainNonConfigurationInstance() и установите для элемента данных boolean (например, isChangingConfigurations ) значение true и проверьте этот элемент данных в onDestroy() .

Это может сделать трюк для вас (от того, как различать изменение ориентации и оставить андроид приложения ):

Используйте метод isFinishing () Activity.

Образец кода:

 @Override protected void onDestroy() { super.onDestroy(); if (isFinishing()) { // Do stuff } else { // It's an orientation change. } } 

У меня есть обходное решение для случаев, когда что-то X нужно делать на onStop (), но вы не хотите, чтобы это было сделано, если есть изменение конфигурации (и, очевидно, у вас нет доступных isChangingConfigurations ()).

Этот метод состоит в том, чтобы сделать это действие X на AsyncTask и задержать. Вы вызываете AsyncTask в onStop () / onPause (), а в onRetainCustomNonConfigurationInstance () вы отменяете задачу. Таким образом, если пользователь нажимает домашний ключ, например, код X будет выполняться на фоне. Однако, если есть поворот экрана, X-код не будет выполнен, потому что задача будет отменена до ее выполнения (это значение задержки).

Я использую его, например, для решения проблем с wakelocks: освобождение их на onPause (), но не в том случае, если пользователь меняет ориентацию экрана.

Вот мой код:

 private class ReleaseWakeLockDelayedTask extends AsyncTask<WakeLock, Integer, Integer>{ @Override protected Integer doInBackground(WakeLock... params) { try { // Delay so that onRetainCustomNonConfigurationInstance is in // time of cancelling the task Thread.sleep(5000); } catch (InterruptedException e) {} if(isCancelled()) return null; releaseWakeLock(params[0]); // own method that calls the actual release return null; } } @Override public Object onRetainCustomNonConfigurationInstance() { ... if(mReleaseWakeLockTask != null && mReleaseWakeLockTask .getStatus() != AsyncTask.Status.FINISHED){ mReleaseWakeLockTask.cancel(true)); } ... } @Override protected void onPause() { // create and call the task boolean wRun; if(mReleaseWakeLockTask != null){ if(mReleaseWakeLockTask .getStatus() != AsyncTask.Status.FINISHED) wRun= false; else wRun= true; }else wRun = true; if(wRun){ mReleaseWakeLockTask = new mReleaseWakeLockTask (); mReleaseWakeLockTask .execute(wakeLock); } } 

Надеюсь, поможет!