Как отличить смену ориентации от выхода из приложения android

Я понимаю, что при изменении ориентации экрана вызываются текущие действия onDestroy(), за которыми следует onCreate() для эффективного воссоздания действия. Мне нужно знать, как программно определить, закрывается ли приложение или изменяется только ориентация.

Один из методов заключается в том, чтобы предыдущее действие уведомляло меня, когда вызывается его метод onResume(), это сообщит мне, что пользователь нажал кнопку «Назад» и ориентация не была изменена.

P.S. Я ищу более элегантное решение, чем прослушивание щелчка задней аппаратной кнопки.

Вот что я хотел сделать:

У меня есть две вкладки, когда действие вводится впервые или пользователь покинул действие и теперь входит в него, отображается определенная вкладка на основе некоторого критерия.

Когда ориентация меняется, мне нужно оставаться на той же вкладке.


person Dustfinger    schedule 08.03.2012    source источник
comment
Можете ли вы просто указать в манифесте, что хотите самостоятельно обрабатывать изменения ориентации? Тогда onDestroy / onCreate не будет вызываться - вместо этого будет вызываться onConfigurationChange вашей активности. Вы можете делать там все, что необходимо.   -  person Aleks G    schedule 08.03.2012
comment
Алекс предложил добавить в ваш манифест android:configChanges для ориентации. Затем вы можете перезаписать onConfigurationChange и обработать изменение ориентации   -  person jsimpson    schedule 08.03.2012
comment
@AleksG: Цитируя документацию для android:configChanges, следует избегать использования этого атрибута и использовать его только в крайнем случае.   -  person CommonsWare    schedule 08.03.2012
comment
Мне нужно знать, как программно определить, закрывается ли приложение или изменяется только ориентация. -- Зачем?   -  person CommonsWare    schedule 08.03.2012
comment
Сначала я думал об обработке изменения ориентации самостоятельно, но казалось, что это много работы, когда логика диктует, что «выход из приложения» и «изменение ориентации» должны различаться жизненным циклом активности. Думаю, мне придется сделать это таким образом (в крайнем случае).   -  person Dustfinger    schedule 08.03.2012
comment
Когда ориентация меняется, мне нужно оставаться на той же вкладке. -- поместите идентификатор вкладки в Bundle, указанный в onSaveInstanceState(), и восстановите выбранную вкладку в onRestoreInstanceState().   -  person CommonsWare    schedule 08.03.2012


Ответы (4)


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

@Override
  protected void onDestroy() {
    super.onDestroy();
    if (isFinishing()) {
      // do stuff
    } else { 
      //It's an orientation change.
    }
  }
person dmon    schedule 08.03.2012
comment
Спасибо, я прочитал об isFinishing() и это то, что мне нужно. Смотрите мое редактирование - person Dustfinger; 08.03.2012
comment
Чтобы сохранить текущую вкладку, вы можете сохранить ее идентификатор в onSaveInstanceState(), а затем прочитать его обратно в onCreate(), таким образом, вам даже не нужно возиться с isFinishing(). Однако будьте осторожны, пакет будет нулевым при первом запуске приложения. - person dmon; 08.03.2012
comment
Один побочный эффект этого подхода: если вы переключитесь на другое приложение, оно не завершит ваше активное (так что это не будет вызываться). Если затем приложение будет закрыто ОС Android для экономии памяти - этот метод БУДЕТ вызываться, isFinishing() будет ЛОЖЬ (см. здесь: developer.android.com/reference/android/app/), что приводит к неправильному выполнению вашего кода изменения ориентации. - person seanhodges; 08.03.2012
comment
Я уже пытался использовать onSaveInstanceState() и читать его обратно в onCreate(), как вы сказали, но проблема все еще заключалась в том, что я не знал, вызывается ли onCreate() изменением ориентации или пользователем, переходящим к действию для первого время. - person Dustfinger; 08.03.2012
comment
Если это первый раз, пакет должен быть нулевым. Даже если оно не было нулевым (по какой-то причине), сохраненное значение вкладки не должно быть там, поэтому вы загрузите вкладку по умолчанию. - person dmon; 08.03.2012
comment
У меня тот же вопрос, но о Фрагментах. - person jasxir; 23.07.2015

вы можете использовать isChangingConfigurations() Читать из документации

Проверьте, не находится ли это действие в процессе уничтожения для воссоздания с новой конфигурацией. Это часто используется в onStop(), чтобы определить, нужно ли очистить состояние или оно будет передано следующему экземпляру активности через onRetainNonConfigurationInstance().

Возвращает Если активность удаляется для воссоздания с новой конфигурацией, возвращает true; иначе возвращает ложь

Объясните простым языком на примере

isChangingConfigurations()

метод, используемый для проверки того, будет ли активность уничтожена для повторного создания (в результате изменения ориентации)

Как это использовать ?

если вы используете API >= 11, то нет проблем, но если вы используете API ‹ 11, тогда мы должны обрабатывать это руководство по методу. Я создаю логическую переменную с именем IsconfigChange

private boolean IsconfigChange ;
...

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IsconfigChange = true ;

}


    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    @Override
    public boolean isChangingConfigurations() {
        if(android.os.Build.VERSION.SDK_INT >= 11){
            Log.i("DEBUG", "Orientation changed api >= 11 ");
            return super.isChangingConfigurations();    
        }else {
            Log.i("DEBUG", "Orientation changed api < 11 ");
            return IsconfigChange; 
        }
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    @Override
    protected void onStop() {
        super.onStop();
        if(isChangingConfigurations()){
            Log.i("DEBUG", "isChangingConfirgurations OnStop Called");
        }  else{
            Log.i("DEBUG", "OnStop Called");
        }
    }

Лето

вы можете использовать isChangingConfigurations в onStop, чтобы проверить, останавливается ли приложение для уничтожения или из-за изменения ориентации.

или вы можете использовать isFinishing проверить мой ответ /28852269#28852269">здесь

person Mina Fawzy    schedule 04.03.2015

для уровня API >= 11 Активность имеет метод isChangingConfigurations()

person Maurycy    schedule 03.11.2014

Вы можете получить значение Activity.getChangingConfigurations() в обратном вызове onDestroy. Это вернет такой результат, как ORIENTATION_PORTRAIT, который вы может свериться с вашей текущей ориентацией.

Обратите внимание, что закрытие активности и изменение ориентации — это не единственные условия, которые следует учитывать здесь: как насчет возврата на главный экран, входящих телефонных звонков и других приложений, перехватывающих Активность больше не находится в начале стека?

В большинстве случаев вам не нужно будет этого делать. Если вы пытаетесь исправить какую-либо проблему с состоянием активности (часто проявляющуюся как NullPointerException при повороте экрана) путем захвата события ориентации; просмотрите жизненный цикл Android Activity и убедитесь, что вы не просто пытаетесь исправить ошибку дизайна. Опубликуйте свою исходную проблему на этом сайте, если вы не уверены.

person seanhodges    schedule 08.03.2012
comment
Спасибо. Если у вас есть лучший способ реализовать то, что я хочу сделать, чем использование isFinishing(), сообщите нам об этом. - person Dustfinger; 08.03.2012
comment
Я думаю, что это лучший способ isFinishing() по причинам, которые я объяснил в ответе dmon, но почему вы вообще хотите это сделать? Редко когда приложению для Android действительно нужно знать, когда оно меняет ориентацию, при условии, что вы придерживаетесь рекомендаций по разработке... - person seanhodges; 08.03.2012
comment
см. отредактированный вопрос, я попытался объяснить, что мне нужно делать. - person Dustfinger; 08.03.2012
comment
Ах, извините, я пропустил редактирование. На вашем месте я бы последовал совету @CommonsWare в комментариях. См. это решение: stackoverflow.com/a/5676186/43662 - person seanhodges; 08.03.2012