Ricarica attività su Android


220

E 'una buona pratica per ricaricare una Activityin Android ?

Quale sarebbe il modo migliore per farlo? this.finishe poi this.startActivitycon l'attività Intent?


3
Non sono uno sviluppatore Android esperto, ma riavviare un'attività sembra un design scadente e dovrebbe essere fatto solo in casi estremi.
Hudson,

@Hudson È ciò che accade nelle modifiche alla configurazione. Se questo è un buon design o no, è completamente un'altra discussione. ;)
hpique

1
@Hudson Quindi ora hai 5 anni di esperienza
nello

@PratikButani, ti conosco? :) Ho circa 8 anni di esperienza ora, ma non molto nello sviluppo di Android.
Hudson,

Hai visitato il mio profilo Lo so: P @Hudson
Butani,

Risposte:


521

Puoi semplicemente usare

finish();
startActivity(getIntent());

per rinfrescare un Activitydentro di sé.


2
Cosa succede se non può essere chiamato all'interno della classe di attività? In qualche modo farlo con il riferimento al contesto?
giorgiline,

1
@giorgiline - Sì, crea un'interfaccia definita all'interno della classe di attività e passa tale interfaccia come parametro a qualsiasi classe esterna da cui la stai utilizzando.
aggregate1166877,

1
Wow, NON pensavo che sarebbe stato così facile.
theblang

1
Come puoi gestire un'attività che è stata avviata per il risultato? Puoi riavviarlo con il chiamante originale che sta ancora ricevendo un risultato?
tothphu,

1
@tothphu - Non provato, ma in teoria penso di si. Tuttavia, la seconda volta che l'attività viene completata, non restituirà il risultato all'attività creata per la prima volta.
Sush

64

per coloro che non vogliono vedere quel battito di ciglia dopo il metodo ricreate () usano semplicemente

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

2
Eccezionale! Volevo ignorare la transizione in modo che l'utente non se ne accorgesse!
Ceddy Muhoza,

Ottimo lavoro! L'utente noterebbe a malapena il ricaricamento.
sam,

38

Questo è ciò che faccio per ricaricare l'attività dopo aver cambiato il ritorno da un cambiamento di preferenza.

@Override
protected void onResume() {

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

Questo essenzialmente fa sì che l'attività si ridisegni.

Aggiornato: un modo migliore per farlo è chiamare il recreate()metodo. Ciò causerà la ricreazione dell'attività.


15
Potrebbe funzionare, ma non è consigliabile chiamare esplicitamente i metodi del ciclo di vita.
ITisha,

Se prendi questo percorso, dovresti usare un metodo init () separato che imposta tutto e lo chiama da onCreate () e onResume (), invece di chiamare onCreate ().
Tom,

1
Ottima soluzione, tranne che non funzionerà in alcune situazioni in cui i metodi del ciclo di vita vengono utilizzati per altre cose. Ad esempio, accedo alla fotocamera del telefono e quando viene scattata la foto, lo schermo ritorna alla mia attività per pubblicarla in una vista. Usando i metodi del ciclo di vita per aggiornare, vengo espulso dal processo della fotocamera e la mia foto non ritorna all'attività, ma piuttosto ottengo l'attività dall'inizio. Solo un esempio di cui essere consapevoli.
Azurespot

1
È importante considerare il launchMode dell'attività quando si utilizza ricreate (). Ad esempio, quando chiamo ricreate () su un'attività con launchMode = singleTop, non vedo che onCreate () venga chiamato in seguito. OTOH, se, invece di chiamare ricreate (), chiamo esplicitamente finish () e seguito da startActivity (), vedo che onCreate () viene chiamato in seguito.
albert c braun,

14

Ho visto le risposte precedenti che sono state fornite per ricaricare l'attività usando Intent. Funzioneranno, ma puoi anche fare lo stesso usando il metodoreatte () indicato nella stessa classe Activity.

Invece di scrivere questo

// Aggiorna l'attività principale alla chiusura della finestra di dialogo

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

Questo può essere fatto solo scrivendo questo

recreate();

recreate()è stata la soluzione per me - "riavviare" l'attività non ha funzionato per me, poiché ho iniziato l'attività usando "StartActivityForResult" e ha rotto il comportamento.
KYL3R


10

Avevo bisogno di aggiornare un elenco di messaggi in una delle mie applicazioni in fretta, quindi ho appena eseguito un aggiornamento della mia attività principale dell'interfaccia utente prima di chiudere la finestra di dialogo in cui mi trovavo. Sono sicuro che ci sono anche modi migliori per farlo.

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

9

Android include un sistema di gestione dei processi che gestisce la creazione e la distruzione di attività che nega in gran parte qualsiasi vantaggio che potresti vedere dal riavvio manuale di un'attività. Puoi vedere maggiori informazioni a riguardo in Application Fundamentals

Ciò che è buona pratica è assicurarsi che i metodi onPause e onStop rilascino tutte le risorse che non è necessario conservare e utilizzare onLowMemory per ridurre al minimo le esigenze delle attività.


2
+1 per menzionare onLowMemory. Non sapevo che esistesse questo metodo!
hpique

4

Inizia con un intento tuo activitye chiudi il activity.

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

4

in alcuni casi è la migliore pratica in altri non è una buona idea è guidata dal contesto se hai scelto di farlo usando il seguente è il modo migliore per passare da un'attività ai suoi figli:

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

il fatto è ogni volta che finisci () da activityIWishToRun che ritorni alla tua attività vivente


1
Forse è vecchio ma mi hai risparmiato un sacco di tempo! :)
Lior Iluz,

4

Ricaricare l'intera attività può essere un compito pesante. Basta inserire la parte di codice che deve essere aggiornata in ( kotlin ):

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

Giava:

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

}

E chiama " onResume () " ogni volta che è necessario.


2

Non credo sia una buona idea ... sarebbe meglio implementare un metodo più pulito. Ad esempio, se l'attività contiene un modulo, il metodo più pulito potrebbe semplicemente cancellare ogni widget nel modulo ed eliminare tutti i dati temporanei. Immagino sia quello che vuoi: ripristinare l'attività al suo stato iniziale.


In realtà, voglio cambiare lo stato dell'applicazione e quindi ricaricare l'attività per riflettere il cambiamento.
hpique,

Qual è lo "stato dell'applicazione" nel tuo caso? Preferenze?
zehrer,

2

Dopo aver provato questo per un po 'non ho trovato conseguenze inattese nel riavvio di un'attività. Inoltre, credo che questo sia molto simile a quello che fa Android per impostazione predefinita quando cambia l'orientamento, quindi non vedo un motivo per non farlo in una circostanza simile.


Al contrario, ho provato a "aggiornare" il mio schermo riavviando l'attività. In apparenza non sembra che nulla sia andato storto, le mie informazioni hanno aggiornato il modo in cui volevo, LogCat racconta una storia diversa. In LogCat, torno al metodo onCreate dell'attività, tenta di estrarre le preferenze. 1o tentativo Ricevo un'eccezione puntatore null, quindi tenta nuovamente di avviarsi in onCreate e riceve l'archivio memorizzato dalla seconda volta. Non sono sicuro di quello che sta succedendo qui, ma volevo solo essere sicuro che non stavi semplicemente guardando il risultato, perché WYSIWIG non era il caso per me.
Taraloca,

Come stai esattamente riavviando l'attività?
hpique,

2

ho lo stesso problema

import android.support.v4.content.IntentCompat;

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

questo codice funziona per me. API Android 17


2

In un'attività puoi chiamare recreate()per "ricreare" l'attività (API 11+)


1

Ho avuto un altro approccio come: impostare la launchModemia attività su singleTope senza chiamare finish(), startActivity(getIntent())farà solo il lavoro. Devo solo preoccuparmi dei nuovi dati sia in onCreate()che onNewIntent. A proposito di Sush, l'applicazione potrebbe lampeggiare come diceva AMAN SINGH. Ma l'approccio di AMAN SINGH creerà comunque una nuova attività che è in qualche modo, non necessaria, anche se ha risolto il problema del "battito di ciglia", credo.

Troppo tardi per questa domanda, ma se qualcuno cerca una soluzione, eccola qui.


0

Dopo il login ho avuto lo stesso problema, quindi l'ho usato

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


0

per me sta funzionando non sta creando altri Intenti e sullo stesso i nuovi dati Intenti caricati.

    overridePendingTransition(0, 0);
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.