Załaduj ponownie aktywność w Androidzie


220

Czy dobrą praktyką jest przeładowywanie Activityw Androidzie ?

Jaki byłby najlepszy sposób na to? this.finisha następnie this.startActivityz działalnością Intent?


3
Nie jestem doświadczonym programistą Androida, ale ponowne uruchomienie działania brzmi jak kiepski projekt i powinno się to odbywać tylko w skrajnych przypadkach.
Hudson,

@Hudson Tak dzieje się w przypadku zmian konfiguracji. Jeśli to dobry projekt, czy nie, to zupełnie inna dyskusja. ;)
hpique

1
@Hudson Więc masz teraz 5 lat doświadczenia programisty: D
Pratik Butani

@PratikButani, znam cię? :) Mam teraz 8 lat doświadczenia, ale niewiele w rozwoju Androida.
Hudson

Odwiedziłeś mój profil, wiem: P @Hudson
Pratik Butani

Odpowiedzi:


521

Możesz po prostu użyć

finish();
startActivity(getIntent());

odświeżyć Activityod wewnątrz.


2
Co zrobić, jeśli nie można go wywołać w klasie aktywności? W jakiś sposób można to zrobić za pomocą odwołania do kontekstu?
giorgiline,

1
@giorgiline - Tak, utwórz interfejs zdefiniowany w klasie aktywności i przekaż ten interfejs jako parametr dowolnej klasie zewnętrznej, z której go używasz.
aggregate1166877

1
Wow, NIE myślałem, że to będzie takie łatwe.
theblang

1
Jak poradzić sobie z działaniem, które rozpoczęło się w celu uzyskania rezultatu? Czy możesz to zrestartować, gdy oryginalny rozmówca nadal otrzymuje wynik?
tothphu

1
@tothphu - Nie próbowałem, ale teoretycznie myślę, że tak. Jednak za drugim razem działanie zostanie zakończone, nie zwróci wyniku do działania, które zostało utworzone po raz pierwszy.
Sush

64

dla tych, którzy nie chcą widzieć tego mrugnięcia po odtworzeniu metody () , wystarczy użyć

 finish();
 overridePendingTransition(0, 0);
 startActivity(getIntent());
 overridePendingTransition(0, 0);

2
Niesamowite! Chciałem zastąpić przejście, aby użytkownik nie zauważył!
Ceddy Muhoza,

Dobra robota! Użytkownik ledwo zauważy przeładowanie.
sam

38

To właśnie robię, aby przeładować aktywność po zmianie powrotu po zmianie preferencji.

@Override
protected void onResume() {

   super.onResume();
   this.onCreate(null);
}

Zasadniczo powoduje to przerysowanie działania.

Zaktualizowano: Lepszym sposobem na to jest wywołanie recreate()metody. Spowoduje to odtworzenie działania.


15
To może działać, ale zdecydowanie nie zaleca się jawnego wywoływania metod cyklu życia.
ITisha,

Jeśli wybierzesz tę trasę, powinieneś użyć oddzielnej metody init (), która ustawia wszystko i wywołuje to z poziomu onCreate () i onResume (), zamiast wywoływać onCreate ().
Tom

1
Świetne rozwiązanie, z wyjątkiem tego, że nie zadziała w niektórych sytuacjach, gdy metody cyklu życia są używane do innych celów. Na przykład uzyskuję dostęp do aparatu telefonu, a po zrobieniu zdjęcia ekran powraca do mojej aktywności, aby opublikować go w widoku. Korzystając z metod cyklu życia w celu odświeżenia, jestem wyrzucany z procesu aparatu, a moje zdjęcie nie wraca do aktywności, ale raczej uzyskuję aktywność od samego początku. Tylko przykład, o którym należy pamiętać.
Azurespot

1
Ważne jest, aby wziąć pod uwagę metodę launchMode działania podczas korzystania z funkcji createate (). Na przykład, gdy wywołuję funkcję createate () dla działania z launchMode = singleTop, nie widzę, aby wywołano następnie funkcję onCreate (). OTOH, jeśli zamiast wywoływać funkcję createate (), jawnie wywołuję metodę finish (), a następnie funkcję startActivity (), widzę, że wywołanie metody onCreate () następuje później.
albert c braun

14

Widziałem wcześniejsze odpowiedzi, które zostały udzielone za przeładowanie aktywności za pomocą Intent. Będą działać, ale możesz również zrobić to samo, używając metody restore () podanej w samej klasie Activity.

Zamiast pisać to

// Odśwież główną aktywność po zamknięciu okna dialogowego

Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish();

Można to zrobić, pisząc tylko to

recreate();

recreate()było dla mnie rozwiązaniem - „ponowne uruchomienie” działania nie działało dla mnie, ponieważ rozpocząłem działanie przy użyciu „StartActivityForResult” i zepsuło to zachowanie.
KYL3R,


10

Musiałem w pośpiechu zaktualizować listę wiadomości w jednej z moich aplikacji, więc po prostu odświeżyłem moją główną aktywność w interfejsie użytkownika, zanim zamknąłem okno dialogowe, w którym byłem. Jestem pewien, że są lepsze sposoby na osiągnięcie tego.

// Refresh main activity upon close of dialog box
Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish(); //

9

Android zawiera system zarządzania procesami, który obsługuje tworzenie i niszczenie działań, co w dużej mierze neguje wszelkie korzyści wynikające z ręcznego ponownego uruchomienia działania. Więcej informacji na ten temat można znaleźć w Podstawach aplikacji

Dobrą praktyką jest jednak upewnienie się, że metody onPause i onStop zwalniają wszelkie zasoby, których nie musisz się trzymać, i używają onLowMemory, aby ograniczyć potrzeby związane z aktywnością do absolutnego minimum.


2
+1 za wzmiankę o onLowMemory. Nie wiedziałem, że taka metoda istnieje!
hpique

4

Zacznij od takiego samego celu activityi zamknij activity.

Intent refresh = new Intent(this, Main.class);
startActivity(refresh);//Start the same Activity
finish(); //finish Activity.

4

w niektórych przypadkach jest to najlepsza praktyka, w innych nie jest to dobry pomysł, jest zależny od kontekstu, jeśli zdecydujesz się to zrobić, korzystając z następujących sposobów, który jest najlepszym sposobem na przejście z aktywności do jej synów:

    Intent i = new Intent(myCurrentActivityName.this,activityIWishToRun.class);    
    startActivityForResult(i, GlobalDataStore.STATIC_INTEGER_VALUE);

chodzi o to, że za każdym razem, gdy zakończysz () od activityIWishToRun, powrócisz do swojej żywej aktywności


1
To może stare, ale właśnie zaoszczędziłeś mi dużo czasu! :)
Lior Iluz

4

Ponowne załadowanie całej aktywności może być trudnym zadaniem. Wystarczy wstawić część kodu, która musi zostać odświeżona ( kotlin ):

override fun onResume() {
    super.onResume()
    //here...
}

Jawa:

@Override
public void onResume(){
    super.onResume();
    //here...

}

I w razie potrzeby wywoływaj „ onResume () ”.


2

Nie sądzę, żeby to był dobry pomysł ... lepiej byłoby zastosować czystszą metodę. Na przykład, jeśli twoja aktywność zawiera formularz, czystsza metoda może po prostu wyczyścić każdy widżet w formularzu i usunąć wszystkie dane tymczasowe. Chyba właśnie tego chcesz: przywrócić aktywność do stanu początkowego.


Właściwie chcę zmienić stan aplikacji, a następnie ponownie załadować aktywność, aby odzwierciedlić zmianę.
hpique

Jaki jest „stan aplikacji” w twoim przypadku? Preferencje?
zehrer

2

Po eksperymentowaniu z tym przez jakiś czas nie znalazłem żadnych nieoczekiwanych konsekwencji ponownego uruchomienia aktywności. Ponadto uważam, że jest to bardzo podobne do tego, co Android domyślnie robi, gdy zmienia się orientacja, więc nie widzę powodu, aby nie robić tego w podobnych okolicznościach.


Przeciwnie, próbowałem „odświeżyć” ekran, ponownie uruchamiając działanie. To nie wydaje się na powierzchni, że coś poszło nie tak, moje informacje zaktualizowały to, czego chciałem, LogCat opowiada inną historię. W LogCat wracam do metody onCreate działania, która próbuje wyciągnąć preferencje. Pierwsza próba Otrzymuję wyjątek wskaźnika zerowego, a następnie próbuje ponownie uruchomić w programie onCreate, a drugi raz otrzymuje parametr przechowywanyPref. Nie jestem pewien, co się tutaj dzieje, ale chciałem mieć pewność, że nie patrzysz tylko na wynik, ponieważ WYSIWIG nie było moim przypadkiem.
taraloca

Jak dokładnie wznawiasz aktywność?
hpique

2

mam ten sam problem

import android.support.v4.content.IntentCompat;

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

ten kod działa dla mnie. Interfejs API Androida 17


2

W działaniu możesz zadzwonić w recreate()celu „odtworzenia” działania (API 11+)


1

Miałem inne podejście, takie jak: ustawienie launchModemojej aktywności na singleTopi bez dzwonienia finish(), po prostu startActivity(getIntent())wykonam zadanie. Trzeba tylko dbać o nowe dane zarówno w, jak onCreate()i w onNewIntent. Po drodze Susha aplikacja może mrugać, jak powiedział AMAN SINGH. Ale podejście AMAN SINGH nadal stworzy nową działalność, która jest w jakiś sposób niepotrzebna, nawet jeśli naprawił problem „mrugnięcia”, tak myślę.

Za późno na to pytanie, ale jeśli ktoś szuka rozwiązania, oto jest.


0

Po zalogowaniu miałem ten sam problem, więc użyłem

@Override
protected void onRestart() {
    this.recreate();
    super.onRestart();
}


0

dla mnie to działa, nie tworzy kolejnych Intencji, a same Intenty ładują nowe dane.

    overridePendingTransition(0, 0);
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.