Recharger l'activité dans Android

220

Est-ce une bonne pratique de recharger un Activitydans Android ?

Quelle serait la meilleure façon de procéder? this.finishpuis this.startActivityavec l'activité Intent?

hpique
la source
3
Je ne suis pas un développeur Android expérimenté, mais le redémarrage d'une activité ressemble à une mauvaise conception et ne doit être effectué que dans des cas extrêmes.
Hudson
@Hudson C'est ce qui se passe lors des changements de configuration. Si c'est une bonne conception ou non, c'est une autre discussion entièrement. ;)
hpique
1
@Hudson Vous êtes donc maintenant 5 ans d'expérience développeur: D
Pratik Butani
@PratikButani, je vous connais? :) J'ai maintenant 8 ans d'expérience, mais pas beaucoup dans le développement Android.
Hudson
Vous avez visité mon profil Je sais: P @Hudson
Pratik Butani

Réponses:

521

Vous pouvez simplement utiliser

finish();
startActivity(getIntent());

pour rafraîchir un Activityde l'intérieur de lui-même.

Sush
la source
2
Que faire si elle ne peut pas être appelée à l'intérieur de la classe d'activité ?, une façon de le faire avec la référence de contexte?
giorgiline
1
@giorgiline - Oui, créez une interface que vous définissez à l'intérieur de la classe d'activité et passez cette interface en tant que paramètre à la classe externe à partir de laquelle vous l'utilisez.
aggregate1166877
1
Wow, je ne pensais pas que ce serait aussi simple.
theblang
1
Comment pouvez-vous gérer une activité qui a été lancée pour obtenir des résultats? Pouvez-vous redémarrer cela avec l'appelant d'origine recevant toujours un résultat?
tothphu
1
@tothphu - Pas essayé cependant, mais théoriquement je pense que oui. Cependant, la deuxième fois que l'activité se termine, elle ne renvoie pas le résultat à l'activité créée pour la première fois.
Sush
64

pour ceux qui ne veulent pas voir ce clignotement après la méthode recreate () , utilisez simplement

 finish();
 overridePendingTransition(0, 0);
 startActivity(getIntent());
 overridePendingTransition(0, 0);
AMAN SINGH
la source
2
Impressionnant! Je voulais remplacer la transition pour que l'utilisateur ne le remarque pas!
Ceddy Muhoza
Bon travail! L'utilisateur remarquerait à peine le rechargement.
sam
38

C'est ce que je fais pour recharger l'activité après avoir changé en revenant d'un changement de préférence.

@Override
protected void onResume() {

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

Cela provoque essentiellement l'activité de se redessiner.

Mise à jour: une meilleure façon de procéder consiste à appeler la recreate()méthode. Cela entraînera la recréation de l'activité.

kingargyle
la source
15
Cela peut fonctionner, mais il est fortement déconseillé d'appeler explicitement les méthodes de cycle de vie.
ITisha
Si vous empruntez cette route, vous devez utiliser une méthode distincte init () qui configure tout et appelle cela depuis onCreate () et onResume (), au lieu d'appeler onCreate ().
Tom
1
Excellente solution, sauf qu'elle ne fonctionnera pas dans certaines situations lorsque vos méthodes de cycle de vie sont utilisées pour d'autres choses. Par exemple, j'accède à l'appareil photo du téléphone et lorsque la photo est prise, l'écran revient à mon activité pour l'afficher dans une vue. En utilisant des méthodes de cycle de vie pour me rafraîchir, je suis exclu du processus de l'appareil photo et ma photo ne revient pas à l'activité, mais je récupère l'activité depuis le début. Juste un exemple à connaître.
Azurespot
1
Il est important de considérer le mode de lancement de l'activité lors de l'utilisation de recréer (). Par exemple, lorsque j'appelle recréer () sur une activité avec launchMode = singleTop, je ne vois pas onCreate () être appelé par la suite. OTOH, si, au lieu d'appeler recreate (), j'appelle explicitement finish () et suivi de startActivity (), je vois onCreate () être appelé par la suite.
albert c braun
14

J'ai vu les réponses précédentes qui ont été données pour recharger l'activité en utilisant Intent. Ceux-ci fonctionneront mais vous pouvez également faire de même en utilisant la méthode recreate () donnée dans la classe Activity elle-même.

Au lieu d'écrire ceci

// Actualiser l'activité principale à la fermeture de la boîte de dialogue

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

Cela peut être fait en écrivant ceci uniquement

recreate();
Rizwan
la source
recreate()était la solution pour moi - "redémarrer" l'activité ne fonctionnait pas pour moi, car j'ai commencé l'activité en utilisant "StartActivityForResult" et cela a cassé le comportement.
KYL3R
13

utilisez simplement

this.recreate();

cela déclenchera la méthode onCreate dans l'activité

Yasiru Nayanajith
la source
10

J'avais besoin de mettre à jour une liste de messages dans l'une de mes applications à la hâte, alors j'ai juste effectué un rafraîchissement de mon activité d'interface principale avant de fermer la boîte de dialogue dans laquelle j'étais. Je suis sûr qu'il existe de meilleures façons d'y parvenir également.

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

Android comprend un système de gestion des processus qui gère la création et la destruction d'activités, ce qui annule en grande partie tout avantage que vous verriez à redémarrer manuellement une activité. Vous pouvez voir plus d'informations à ce sujet dans Application Fundamentals

Cependant, la bonne pratique consiste à s'assurer que vos méthodes onPause et onStop libèrent toutes les ressources que vous n'avez pas besoin de conserver et d'utiliser onLowMemory pour réduire vos besoins d'activités au minimum absolu.

Al Sutton
la source
2
+1 pour avoir mentionné onLowMemory. Je ne savais pas qu'une telle méthode existait!
hpique
4

Commencez avec votre intention activityet fermez le activity.

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

dans certains cas, c'est la meilleure pratique dans d'autres, ce n'est pas une bonne idée que cela dépend du contexte si vous choisissez de le faire en utilisant ce qui suit est le meilleur moyen de passer d'une activité à ses fils:

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

la chose est chaque fois que vous avez terminé () de activityIWishToRun vous retournez à votre activité vivante

yoav.str
la source
1
C'est peut-être vieux mais tu viens de me faire gagner beaucoup de temps! :)
Lior Iluz
4

Recharger toute votre activité peut être une tâche difficile. Mettez simplement la partie du code qui doit être actualisée dans ( kotlin ):

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

Java:

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

}

Et appelez " onResume () " chaque fois que nécessaire.

est devenu_humain
la source
2

Je ne pense pas que ce soit une bonne idée ... il serait préférable de mettre en œuvre une méthode plus propre. Par exemple, si votre activité contient un formulaire, la méthode de nettoyage peut simplement effacer chaque widget du formulaire et supprimer toutes les données temporaires. Je suppose que c'est ce que vous voulez: restaurer l'activité à son état initial.

Cristian
la source
En fait, je souhaite modifier l'état de l'application, puis recharger l'activité pour refléter le changement.
hpique
Quel est "l'état de l'application" dans votre cas? Préférences?
2010
2

Après avoir expérimenté cela pendant un certain temps, je n'ai trouvé aucune conséquence inattendue du redémarrage d'une activité. En outre, je pense que cela est très similaire à ce que fait Android par défaut lorsque l'orientation change, donc je ne vois pas de raison de ne pas le faire dans des circonstances similaires.

hpique
la source
Au contraire, j'ai essayé de "rafraîchir" mon écran en redémarrant l'activité. Il n'apparaît pas à la surface, tout s'est mal passé, mes informations ont mis à jour ce que je voulais, le LogCat raconte une histoire différente. Dans LogCat, je reviens dans la méthode onCreate de l'activité, il tente de tirer les préférences. 1ère tentative Je reçois une exception de pointeur nul, puis il tente à nouveau de démarrer dans le onCreate et reçoit le storedPref la 2ème fois. Je ne sais pas ce qui se passe ici, mais je voulais juste être sûr que vous ne regardiez pas simplement le résultat, car WYSIWIG n'était pas le cas pour moi.
taraloca
Comment redémarrez-vous exactement l'activité?
hpique
2

j'ai le même problème

import android.support.v4.content.IntentCompat;

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

ce code fonctionne pour moi. Android api 17

Adnan Abdollah Zaki
la source
2

Dans une activité, vous pouvez appeler recreate()pour "recréer" l'activité (API 11+)


la source
1

J'avais une autre approche comme: régler launchModemon activité sur singleTopet sans appeler finish(), startActivity(getIntent())fera juste le travail. Il suffit de se soucier des nouvelles données à la fois dans onCreate()et onNewIntent. À la manière de Sush, l'application peut clignoter comme l'a dit AMAN SINGH. Mais l'approche d'AMA SINGH créera toujours une nouvelle activité qui est en quelque sorte inutile, même s'il a résolu le problème du «clignotement», je pense.

Trop tard pour cette question, mais si quelqu'un cherche une solution, la voici.

MARCHEUR
la source
0

Après la connexion, j'ai eu le même problème, j'ai donc utilisé

@Override
protected void onRestart() {
    this.recreate();
    super.onRestart();
}
Rajnish Sharma
la source
0

je l'ai utilisé et cela fonctionne bien sans finish()

startActivity(getIntent());
Hocine Kheddadji
la source
0

pour moi ça marche ça ne crée pas une autre intention et sur la même intention les nouvelles données chargées.

    overridePendingTransition(0, 0);
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
Anil kumar
la source