web-dev-qa-db-fra.com

Comment redémarrer une activité Android

Comment redémarrer une Android Activity? J'ai essayé ce qui suit, mais la Activity se ferme simplement.

public static void restartActivity(Activity act){

        Intent intent=new Intent();
        intent.setClass(act, act.getClass());
        act.startActivity(intent);
        act.finish();

}
339
user157195

J'ai fait mon sélecteur de thème comme ceci:

Intent intent = getIntent();
finish();
startActivity(intent);

Fondamentalement, j'appelle d'abord finish() et j'utilise exactement le même objectif que celui avec lequel cette activité a été démarrée. Cela semble faire l'affaire?

UPDATE: Comme Ralf l’a souligné ci-dessous, Activity.recreate() est la voie à suivre dans l’API 11 et au-delà. Ceci est préférable si vous êtes dans un environnement API11 +. Vous pouvez toujours vérifier la version actuelle et appeler l'extrait de code ci-dessus si vous êtes dans l'API 10 ou une version antérieure. (N'oubliez pas de faire passer la réponse de Ralf!)

577
EboMike

Depuis l’API niveau 11 (Honeycomb), vous pouvez appeler la méthode recreate () de l’activité (grâce à this answer).

La méthode recreate () agit comme un changement de configuration, vos méthodes onSaveInstanceState () et onRestoreInstanceState () sont également appelées, le cas échéant.

332
Ralf

Avant SDK 11, voici comment procéder:

public void reload() {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);
    startActivity(intent);
}
125
Ben

Juste pour combiner les réponses de Ralf et Ben (y compris les modifications apportées aux commentaires):

if (Build.VERSION.SDK_INT >= 11) {
    recreate();
} else {
    Intent intent = getIntent();
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);

    startActivity(intent);
    overridePendingTransition(0, 0);
}
109
JustinMorris

J'ai utilisé ce code pour pouvoir prendre en charge les anciennes versions d'Android et utiliser recreate() sur les nouvelles versions d'Android.

Code:

public static void restartActivity(Activity activity){
    if (Build.VERSION.SDK_INT >= 11) {
        activity.recreate();
    } else {
        activity.finish();
        activity.startActivity(activity.getIntent());
    }
}

Échantillon:

import Android.app.Activity;
import Android.os.Build;
import Android.os.Bundle;
import Android.support.v7.app.AppCompatActivity;
import Android.view.View;
import Android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Activity mActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mActivity = MainActivity.this;

        Button button = (Button) findViewById(R.id.restart_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                restartActivity(mActivity);
            }
        });
    }

    public static void restartActivity(Activity activity) {
        if (Build.VERSION.SDK_INT >= 11) {
            activity.recreate();
        } else {
            activity.finish();
            activity.startActivity(activity.getIntent());
        }
    }
}
20
Thomas Vos

Cette solution a fonctionné pour moi.

Terminez d'abord l'activité, puis recommencez.

Exemple de code:

public void restartActivity(){
    Intent mIntent = getIntent();
    finish();
    startActivity(mIntent);
}
20
user3748515

C'est de loin le moyen le plus simple de relancer l'activité en cours:

finish();
startActivity(getIntent());
18
Abhishek Soni

Appelez cette méthode

private void restartFirstActivity()
 {
 Intent i = getApplicationContext().getPackageManager()
 .getLaunchIntentForPackage(getApplicationContext().getPackageName() );

 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );
 startActivity(i);
 }

Merci,

17
Nikhil Dinesh

Même si cela a été répondu à plusieurs reprises.

Si vous redémarriez une activité à partir d'un fragment, je le ferais comme suit:

new Handler().post(new Runnable() {

         @Override
         public void run()
         {
            Intent intent = getActivity().getIntent();
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
            getActivity().overridePendingTransition(0, 0);
            getActivity().finish();

            getActivity().overridePendingTransition(0, 0);
            startActivity(intent);
        }
    });

Donc, vous pensez peut-être que c'est un peu exagéré? Mais l'affichage Handler vous permet d'appeler cela dans une méthode de cycle de vie. J'ai utilisé cela dans les méthodes onRestart/onResume lors de la vérification du changement d'état entre l'utilisateur revenant à l'application. (installé quelque chose). 

Sans la Handler, si vous l'appelez dans un endroit étrange, l'activité sera simplement supprimée et non redémarrée.

N'hésitez pas à poser des questions.

Cordialement, Chris

15
Chris.Jenkins

Eh bien, ce n'est pas répertorié, mais un combo de certains qui est déjà posté:

if (Build.VERSION.SDK_INT >= 11) {
    recreate();   
} else {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}
15
Codeversed
public void onRestart() {
    super.onRestart();
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    finish();
    act.startActivity(intent);
}

essayez d'utiliser ceci ..

3
Amsheer

En conjonction avec étrange comportement du cycle de vie de SurfaceView avec l'appareil photo . J'ai trouvé que recreate () ne se comportait pas bien avec le cycle de vie de SurfaceViews. surfaceDestroyed n'est jamais appelé pendant le cycle de récréation. Il est appelé après onResume (étrange), à ​​quel point ma SurfaceView est détruite.

La manière originale de recréer une activité fonctionne bien.

Intent intent = getIntent();
finish();
startActivity(intent);

Je ne peux pas comprendre exactement pourquoi, mais il s’agit simplement d’une observation qui, espérons-le, pourra guider les autres dans l’avenir, car elle corrige les problèmes que j’avais avec SurfaceViews

3
The4thIceman

Il y a une façon de hacky qui devrait fonctionner pour n'importe quelle activité, y compris la principale.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

Lorsque l'orientation change, Android recrée généralement votre activité (sauf si vous la remplacez). Cette méthode est utile pour les rotations à 180 degrés, lorsque Android ne recrée pas votre activité. 

3
Achal Dave

En réalité, le code suivant est valide pour les API de niveaux 5 et supérieurs. Par conséquent, si votre API cible est inférieure, vous obtiendrez quelque chose de très similaire au code d'EboMike.

intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
overridePendingTransition(0, 0);
3
Sandy

La solution à votre question est la suivante:

public static void restartActivity(Activity act){
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    ((Activity)act).startActivity(intent);
    ((Activity)act).finish();
}

Vous devez transtyper en contexte d'activité pour démarrer une nouvelle activité et pour terminer l'activité en cours.

J'espère que cela vous aidera ... et fonctionne pour moi.

2
Rajesh Peram

Si vous supprimez la dernière ligne, vous créerez une nouvelle activité act, mais votre ancienne instance sera toujours active.

Devez-vous redémarrer l’activité comme lorsque l’orientation est modifiée (c’est-à-dire que votre état est enregistré et passé à onCreate(Bundle))?

Si vous ne le faites pas, une solution de contournement possible consisterait à utiliser une activité factice supplémentaire, qui serait lancée à partir de la première activité, et le travail consistant à démarrer une nouvelle instance de celle-ci. Ou retardez simplement l'appel à act.finish(), une fois le nouveau démarré.

Si vous devez sauver la majeure partie de l'état, vous vous retrouvez dans des eaux assez profondes, car il est non trivial de transmettre toutes les propriétés de votre état, en particulier sans laisser fuir votre ancien contexte/activité, en le transmettant à la nouvelle instance.

S'il vous plaît, spécifiez ce que vous essayez de faire.

1
Dimitar Dimitrov

vous pouvez simplement utiliser 

onRestart ()

méthode comme suit

 @Override
    protected void onRestart() {
        super.onRestart();
        setContentView(R.layout.add_entry);
    }

et appelez onRestart () où vous voulez redémarrer l'activité en cours

0
SuKu