Comment redémarrer une activité Android

Comment redémarrer un Android Activity ? J'ai essayé la suivante, mais le Activity quitte tout simplement.

public static void restartActivity(Activity act){

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

}
328
demandé sur N J 2009-09-09 07:12:37

19 réponses

j'ai fait mon commutateur de thème comme ceci:

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

en gros, j'appelle finish() en premier, et j'utilise la même intention que celle avec laquelle cette activité a commencé. Qui semble faire l'affaire?

mise à JOUR: Comme l'a souligné par Ralf ci-dessous, Activity.recreate() est la manière d'aller de l'API de 11 et au-delà. C'est préférable si vous êtes dans un environnement API11+. Vous pouvez toujours vérifier la version actuelle et appeler le code snippet ci-dessus si vous êtes dans API 10 ou moins. (S'il vous plaît n'oubliez pas de upvote Ralf réponse!)

560
répondu EboMike 2013-08-20 23:07:17

depuis API Niveau 11 (Honeycomb), vous pouvez appeler le recreate () méthode de l'activité (grâce à ce réponse).

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

323
répondu Ralf 2017-05-23 11:33:24

avant SDK 11, une façon de faire ceci est comme ceci:

public void reload() {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);
    startActivity(intent);
}
124
répondu Ben 2015-09-05 11:33:16

juste pour combiner les réponses DE Ralf et Ben (y compris les changements apportés dans les 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);
}
107
répondu JustinMorris 2014-01-14 23:32:23

Cette solution a fonctionné pour moi.

terminez D'abord l'activité, puis recommencez.

code échantillon:

public void restartActivity(){
    Intent mIntent = getIntent();
    finish();
    startActivity(mIntent);
}
20
répondu user3748515 2015-11-04 13:32:45

j'ai utilisé ce code donc je pouvais encore prendre en charge les anciennes versions Android et utiliser recreate() sur les nouvelles versions 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
répondu Thomas Vos 2016-12-15 13:59:55

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
répondu Nikhil Dinesh 2012-03-23 13:43:52

C'est de loin la façon la plus facile de redémarrer l'activité actuelle:

finish();
startActivity(getIntent());
16
répondu Abhishek Soni 2016-03-01 10:57:59

même si cela a été répondu plusieurs fois.

si redémarrer une activité à partir d'un fragment, je le ferais comme ça:

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 pourriez penser 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é ceci dans les méthodes onRestart / onResume pour vérifier si l'État a changé entre l'utilisateur revenant à l'application. (installé quelque chose).

sans le Handler si vous l'appelez dans un endroit Impair il tuera juste l'activité et ne la relancera pas.

n'hésitez pas à poser des questions.

santé, Chris

15
répondu Chris.Jenkins 2012-07-25 13:49:31

Eh bien ce N'est pas énuméré mais un combo de certains qui est déjà affiché:

if (Build.VERSION.SDK_INT >= 11) {
    recreate();   
} else {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}
15
répondu Codeversed 2013-07-13 00:22:48

en fait, le code suivant est valide pour les API de niveau 5 et plus, donc si votre API cible est inférieure à cela, vous finirez avec quelque chose de très similaire au code D'EboMike.

intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
overridePendingTransition(0, 0);
3
répondu Sandy 2011-06-20 05:29:25

il y a une façon détournée de travailler sur n'importe quelle activité, y compris la principale.

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

lorsque l'orientation change, Android recréera généralement votre activité (à moins que vous ne l'outrepassiez). Cette méthode est utile pour les rotations de 180 degrés, lorsque Android ne recrée pas votre activité.

3
répondu Achal Dave 2013-06-13 23:53:39
public void onRestart() {
    super.onRestart();
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    finish();
    act.startActivity(intent);
}

essayez d'utiliser cette ..

3
répondu Amsheer 2014-04-23 16:34:10

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

la façon originale de recréer une activité fonctionne très bien.

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

Je n'arrive pas à comprendre exactement pourquoi, mais c'est juste une observation que peut espérer de guider les autres dans l'avenir parce qu'il fixe mes problèmes que j'avais avec SurfaceViews

3
répondu The4thIceman 2017-05-23 11:33:24

la solution à votre question Est:

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

vous devez lancer au contexte d'activité pour commencer une nouvelle activité et aussi bien que pour finir l'activité actuelle.

Espère que cela utile..et fonctionne pour moi.

2
répondu Rajesh Peram 2017-04-18 12:52:41

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

avez-vous besoin de redémarrer l'Activité, comme lorsque l'orientation est modifiée (par exemple, votre état est enregistré et transmis à onCreate(Bundle) )?

si vous ne le faites pas, une solution possible serait d'utiliser une activité fictive supplémentaire, qui serait commencée à partir de la première activité, et quel travail est de commencer une nouvelle instance de celui-ci. Ou tout simplement reportez l'appel à act.finish() , après le début du nouveau.

si vous avez besoin de sauver la plus grande partie de l'état, vous obtenez dans les eaux assez profondes, parce qu'il est non-trivial de passer toutes les propriétés de votre état, surtout sans laisser filtrer votre ancien contexte/activité, en le passant à la nouvelle instance.

veuillez préciser ce que vous essayez de faire.

1
répondu Dimitar Dimitrov 2009-09-09 09:10:11

je me demande pourquoi personne n'a mantioné Intent.makeRestartActivityTask() qui rend proprement ce but précis.

faire une intention qui peut être utilisée pour relancer la tâche d'une application * dans son état de base.

startActivity(Intent.makeRestartActivityTask(getActivity().getIntent().getComponent())

cette méthode définit Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK comme Drapeaux par défaut.

0
répondu shkschneider 2018-09-06 08:09:31

si vous appelez d'un fragment, faites donc en dessous du code.

Intent intent = getActivity().getIntent();
getActivity().finish();
startActivity(intent);
-1
répondu Mihir Trivedi 2015-11-04 10:37:28

appelez la méthode onCreate. Par exemple onCreate(null);

-4
répondu kike0kike 2014-12-15 08:04:01