Czy dobrą praktyką jest przeładowywanie Activity
w Androidzie ?
Jaki byłby najlepszy sposób na to? this.finish
a następnie this.startActivity
z działalnością Intent
?
Czy dobrą praktyką jest przeładowywanie Activity
w Androidzie ?
Jaki byłby najlepszy sposób na to? this.finish
a następnie this.startActivity
z działalnością Intent
?
Odpowiedzi:
Możesz po prostu użyć
finish();
startActivity(getIntent());
odświeżyć Activity
od wewnątrz.
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);
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.
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.
po prostu użyj
this.recreate();
uruchomi to metodę onCreate w działaniu
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(); //
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.
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
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 () ”.
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.
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.
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
W działaniu możesz zadzwonić w recreate()
celu „odtworzenia” działania (API 11+)
Miałem inne podejście, takie jak: ustawienie launchMode
mojej aktywności na singleTop
i 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.
Po zalogowaniu miałem ten sam problem, więc użyłem
@Override
protected void onRestart() {
this.recreate();
super.onRestart();
}
użyłem tego i działa bez niego
finish()
startActivity(getIntent());
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);