Jak odróżnić zmianę orientacji i opuszczenie aplikacji android

Rozumiem, że gdy zmienia się orientacja ekranu, bieżące działania onDestroy() są wywoływane, a następnie OnCreate (), aby skutecznie odtworzyć działanie. Muszę wiedzieć, jak programowo powiedzieć, czy aplikacja jest wyłączana lub czy tylko orientacja jest zmieniana.

Jedna z metod polega na tym, aby poprzednia aktywność powiadamiała mnie o wywołaniu metody onResume (), to da mi znać, że użytkownik nacisnął przycisk Wstecz i orientację nic się nie zmieniło.

P. S. szukam rozwiązania bardziej eleganckiego niż słuchanie tylnego przycisku sprzętowego.

Oto co chciałem zrobić:

Mam dwie zakładki, gdy aktywność jest wprowadzana po raz pierwszy lub użytkownik opuścił aktywność i teraz ją wprowadza, pewna zakładka jest wyświetlana na podstawie jakiegoś kryterium.

Gdy zmieni się orientacja, muszę pozostać na tej samej karcie.

Author: Jehoshaph Akshay, 2012-03-08

4 answers

Użyj metody działania isFinishing().

@Override
  protected void onDestroy() {
    super.onDestroy();
    if (isFinishing()) {
      // do stuff
    } else { 
      //It's an orientation change.
    }
  }
 88
Author: dmon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-08 16:23:24

Możesz użyć isChangingConfigurations() odczytać z dokumentacji

Sprawdź, czy ta aktywność jest w trakcie zniszczony w celu odtworzenia z nową konfiguracją. To jest często używane w OnStop () do określenia, czy państwo musi być wyczyszczone lub zostaną przekazane do następnej instancji działania poprzez onretainnonconfigurationinstance ().

Zwraca, jeśli aktywność jest niszczona w celu odtworzenia z nowym konfiguracja, zwraca true; else zwraca false

Wyjaśnij w prosty sposób za pomocą przykładu

isChangingConfigurations()

Jest metodą sprawdzającą, czy działanie zostanie zniszczone i ponownie utworzone (w wyniku zmiany orientacji)

Jak go używać ?

Jeśli używasz api >= 11 to nie ma problemu, ale jeśli używasz api 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

Możesz użyć isChangingConfigurations in onStop, aby sprawdzić, czy aplikacja ma zostać zniszczona lub ze względu na zmianę orientacji .

Lub możesz użyć isFinishing Sprawdź moją odpowiedź tutaj

 19
Author: Mina Fawzy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:22

Dla API LVL > = 11 aktywność ma metodę isChangingConfigurations()

 3
Author: Maurycy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-03 21:48:07

Możesz pobrać wartość aktywności .getChangingConfigurations () metoda w wywołaniu zwrotnym onDestroy. Zwróci to wynik, taki jak ORIENTATION_PORTRAIT , który możesz sprawdzić pod kątem bieżącej orientacji .

Zauważ, że zamykanie aktywności i zmiany orientacji nie są warunkami tylko do rozważenia tutaj: co z powrotem na ekran główny, przychodzące połączenia telefoniczne i inne aplikacje kradnące ostrość i wszystkie inne scenariusze kiedy Twoja aktywność nie znajduje się już na początku stosu?

Przez większość czasu nie będziesz musiał tego robić. Jeśli próbujesz naprawić pewien problem ze stanem aktywności (często przejawiający się jako NullPointerException podczas obracania ekranu) przechwytując Zdarzenie orientacyjne; przejrzyj cykl życia aktywności Androida i upewnij się, że nie próbujesz tylko włamać się do poprawki wady projektu. Opublikuj swój oryginalny problem na tej stronie, jeśli nie masz pewności.

 1
Author: seanhodges,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-08 16:28:18