¿Cómo reinicio una actividad de Android?

¿Cómo reinicio una Activity Android? Intenté 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 cambio de tema de esta manera:

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

Básicamente, estoy llamando a finish() primero, y estoy usando el mismo bash exacto con el que se inició esta actividad. Eso parece hacer el truco?

ACTUALIZACIÓN: Como señala 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 +. Todavía puede verificar la versión actual y llamar al fragmento de código anterior si está en la API 10 o inferior. (¡No se olvide de votar la respuesta de Ralf!)

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

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

Antes del SDK 11, una forma de hacerlo es así:

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

Solo para combinar las respuestas de Ralf y Ben (incluidos los cambios realizados 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 termine la actividad y luego comience nuevamente.

Código de muestra:

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

Utilicé este código así que todavía podía soportar versiones anteriores de Android y usar recreate() en las versiones más nuevas 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()); } } } 

Llamar 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,

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

 finish(); startActivity(getIntent()); 

Aunque esto ha sido respondido varias veces.

Si reinicié 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); } }); 

Entonces, ¿podrías estar pensando que esto es un poco exagerado? Pero la publicación del Handler permite llamar a esto en un método de ciclo de vida. Lo he usado en los métodos de onRestart / onResume para comprobar si el estado ha cambiado entre el usuario que vuelve a la aplicación. (instalado algo).

Sin Handler si lo llamas en un lugar extraño, simplemente matará la actividad y no la reiniciará.

No dude en hacer cualquier pregunta.

Saludos, Chris

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

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

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

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

Hay una forma hacky que debería funcionar en cualquier actividad, incluida la principal.

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

Cuando cambie la orientación, Android generalmente recreará tu actividad (a menos que la anules). 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); } 

trata de usar esto …

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

La forma original de recrear una actividad funciona bien.

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

No puedo entender exactamente por qué es esto, pero es solo una observación que con suerte puede guiar a otros en el futuro porque solucionó mis problemas que tenía con SurfaceViews.

La solución para tu 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 lanzar al contexto de la actividad para comenzar una nueva actividad y también para finalizar la actividad actual.

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

Si elimina la última línea, creará una nueva actividad, 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 alternativa sería usar una Actividad ficticia adicional, que se iniciaría a partir de la primera Actividad, y cuyo trabajo es iniciar una nueva instancia de la misma. O simplemente demore la llamada a act.finish() , después de que se inicie el nuevo.

Si necesita guardar la mayor parte del estado, se está metiendo en aguas bastante profundas, porque no es trivial pasar todas las propiedades de su estado, especialmente sin filtrar su antiguo Contexto / Actividad, pasándolo a la nueva instancia.

Por favor, especifica qué estás tratando de hacer.

Si llamas desde algún fragmento, hazlo debajo del código.

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

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