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();
}
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!)
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.
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);
}
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);
}
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());
}
}
}
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);
}
C'est de loin le moyen le plus simple de relancer l'activité en cours:
finish();
startActivity(getIntent());
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,
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
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);
}
public void onRestart() {
super.onRestart();
Intent intent=new Intent();
intent.setClass(act, act.getClass());
finish();
act.startActivity(intent);
}
essayez d'utiliser ceci ..
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
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é.
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);
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.
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.
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