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?

hpique
źródło
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.

Sush
źródło
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);
AMAN SINGH
źródło
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.

kingargyle
źródło
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();
Rizwan
źródło
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,
13

po prostu użyj

this.recreate();

uruchomi to metodę onCreate w działaniu

Yasiru Nayanajith
źródło
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(); //
dziewięćset
źródło
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.

Al Sutton
źródło
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.
Jorgesys
źródło
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

yoav.str
źródło
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 () ”.

stał się człowiekiem
źródło
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.

Cristian
źródło
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.

hpique
źródło
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

Adnan Abdollah Zaki
źródło
2

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


źródło
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.

PIECHUR
źródło
0

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

@Override
protected void onRestart() {
    this.recreate();
    super.onRestart();
}
Rajnish Sharma
źródło
0

użyłem tego i działa bez niego finish()

startActivity(getIntent());
Hocine Kheddadji
źródło
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);
Anil Kumar
źródło