Как отличить смену ориентации от выхода из приложения android - PullRequest
45 голосов
/ 08 марта 2012

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

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

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

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

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

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

Ответы [ 4 ]

92 голосов
/ 08 марта 2012

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

@Override
  protected void onDestroy() {
    super.onDestroy();
    if (isFinishing()) {
      // do stuff
    } else { 
      //It's an orientation change.
    }
  }
20 голосов
/ 04 марта 2015

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

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

Возвращает, если действие разрывается взаказ, который будет воссоздан с новой конфигурацией, возвращает true;else возвращает false

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

isChangingConfigurations()

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

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

если вы используете api> = 11, тогда нет проблем, но если вы используете api <11, томы должны обработать этот метод вручную. Я создаю логическую переменную с именем <strong>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");
        }
    }

Summery

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

или вы можете использовать isFinishing проверить мой ответ здесь

3 голосов
/ 04 ноября 2014

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

1 голос
/ 08 марта 2012

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

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

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

...