¿Cómo reinicio una actividad de Android?

¿Cómo reinicio una Activity Android? He intentado lo siguiente, pero la Activity simplemente se cierra.

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

Hice mi conmutador de temas como este:

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

Básicamente, estoy llamando a finish() primero, y estoy usando exactamente la misma intención con la que esta actividad se inició. ¿Eso parece hacer el truco?

ACTUALIZACIÓN: Como señaló Ralf a continuación, Activity.recreate() es el camino a seguir en API 11 y más allá. Esto es preferible si está en un entorno API11 +. Aún puede comprobar la versión actual y llamar al fragmento de código anterior si está en la API 10 o inferior. (¡Por favor, no olvides subir la respuesta de Ralf!)

Desde API nivel 11 (Honeycomb), puede llamar al método recreate () de la actividad (gracias a esta respuesta).

El método recreate () actúa como un cambio de configuración, por lo que también se llaman los métodos onSaveInstanceState () y onRestoreInstanceState (), si corresponde.

Antes de SDK 11, una manera de hacer esto es así:

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

Sólo para combinar las respuestas de Ralf y Ben (incluyendo los cambios hechos en los comentarios):

 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); } 

Esta solución funcionó para mí.

Primero termina la actividad y luego empieza de nuevo.

Código de muestra:

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

Llame a este método

 private void restartFirstActivity() { Intent i = getApplicationContext().getPackageManager() .getLaunchIntentForPackage(getApplicationContext().getPackageName() ); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK ); startActivity(i); } 

Gracias,

Aunque esto ha sido contestado varias veces.

Si recomenzaba una actividad de un fragmento, lo haría así:

 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); } }); 

¿Podrías pensar que esto es un poco excesivo? Sin embargo, la publicación de Handler permite llamar a esto en un método de ciclo de vida. He utilizado esto en onRestart / onResume métodos al comprobar si el estado ha cambiado entre el usuario volver a la aplicación. (Algo instalado).

Sin el Handler si lo llaman en un lugar extraño que acaba de matar a la actividad y no reiniciarlo.

No dude en hacer cualquier pregunta.

Saludos, Chris

Utilicé este código para poder seguir soportando versiones anteriores de Android y usar recreate() en versiones más recientes de Android.

Código:

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

Muestra:

 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()); } } } 

Bueno, esto no está en la lista, pero un combo de algunos que ya está publicado:

 if (Build.VERSION.SDK_INT >= 11) { recreate(); } else { Intent intent = getIntent(); finish(); startActivity(intent); } 

Esta es de lejos la manera más fácil de reiniciar la actividad actual:

 finish(); startActivity(getIntent()); 

En realidad, el siguiente código es válido para los niveles de API 5 y superiores, por lo que si su API de destino es inferior a esto, terminará con algo muy similar al código de EboMike.

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

Hay una manera hacky que debe trabajar en cualquier actividad, incluyendo la principal.

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

Cuando la orientación cambia, Android generalmente recreará su actividad (a menos que la cancele). Este método es útil para rotaciones de 180 grados, cuando Android no recrea su actividad.

 public void onRestart() { super.onRestart(); Intent intent=new Intent(); intent.setClass(act, act.getClass()); finish(); act.startActivity(intent); } 

Trate de usar esto

En combinación con el comportamiento extraño del ciclo de vida de SurfaceView con la cámara . He encontrado que recreate () no se comporta bien con el ciclo de vida de SurfaceViews. SurfaceDestroyed no se llama nunca durante el ciclo de recreación. Se llama después de onResume (extraño), en cuyo punto mi SurfaceView se destruye.

La forma original de recrear una actividad funciona bien.

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

No puedo averiguar exactamente por qué esto es, pero es sólo una observación que se puede guiar a otros en el futuro, ya que arregló mis problemas que estaba teniendo con SurfaceViews

Si elimina la última línea, creará una actividad de actividad nueva, pero su instancia anterior seguirá activa.

¿Necesita reiniciar la actividad como cuando se cambia la orientación (es decir, su estado se guarda y pasa a onCreate(Bundle) )?

Si no lo hace, una posible solución sería utilizar una actividad extra, dummy, que se iniciaría desde la primera Actividad, y qué tarea debe iniciar una nueva instancia de la misma. O simplemente retrasar la llamada a act.finish() , después de que se inicie la nueva.

Si necesitas salvar la mayor parte del estado, estás entrando en aguas bastante profundas, porque no es trivial pasar todas las propiedades de tu estado, especialmente sin filtrar tu antiguo Contexto / Actividad, pasándolo a la nueva instancia.

Por favor, especifique qué intenta hacer.

La solución para su pregunta es:

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

Debe emitir al contexto de actividad para iniciar una nueva actividad y finalizar la actividad actual.

Espero que esto útil..y funciona para mí.

Si está llamando desde algún fragmento, hágalo debajo del código.

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

Llame al método onCreate. Por ejemplo onCreate(null);

  • Android - ¿Cómo obtener una lista de todos los filtros de intención disponibles?
  • Haga clic en la notificación inicia la actividad dos veces.
  • Datos de paso de Android entre Fragmentos
  • Cambiar el color de las pestañas de navegación mediante programación
  • Fragmentar o no fragmentos - Fragmentos anidados contra actividades. ¿Por qué debo usar más de una actividad?
  • El botón de retroceso de Android no funciona
  • ¿Cómo hago anuncios de banners (admob) comunes para todas mis actividades
  • Biblioteca de SlidingMenu con ActionBarSherlock
  • Diferencia entre ActionBarActivity y Fragment Activity
  • ¿Cómo puedo iniciar la aplicación en la actividad principal?
  • Iniciar actividad con el botón Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.