vida una todas studio reiniciar que pausar las detener destruir ciclo cerrar activity actividades actividad android android-activity

todas - ¿Cómo reinicio una actividad de Android?



reiniciar activity android studio (19)

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


A pesar de que esto ha sido respondido varias veces.

Si reinicio una actividad desde 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 excesivo? Pero la publicación del Handler permite llamar a esto en un método de ciclo de vida. He usado esto en los métodos onRestart / onResume al verificar si el estado ha cambiado entre el usuario que regresa a la aplicación. (instalado algo).

Sin el Handler si lo llama en un lugar extraño, solo matará la actividad y no la reiniciará.

No dude en hacer cualquier pregunta.

Saludos, Chris


Antes del SDK 11, una forma 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); }


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

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


Desde el nivel de API 11 (Honeycomb), puede llamar al método Activity.recreate() de la actividad (gracias a this 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.


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 más baja que esto, terminará con algo muy similar al código de EboMike.

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


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

finish(); startActivity(getIntent());


Esta solución funcionó para mí.

Primero termina la actividad y luego comienza de nuevo.

Código de muestra:

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


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

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

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


Hice mi interruptor de tema de esta manera:

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

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

ACTUALIZACIÓN: Como lo 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ás en un entorno API11 +. Aún puede verificar la versión actual y llamar al fragmento de código anterior si está en API 10 o inferior. (¡Por favor, no olvide votar a favor de la respuesta de Ralf!)


Junto 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 no se llama nunca durante el ciclo de recreación. Se llama después de onResume (extraño), momento en el que 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é esto es así, 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 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 iniciar el contexto de la actividad para iniciar una nueva actividad y para finalizar la actividad actual.

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


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


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


Me pregunto por qué nadie ha pensado en Intent.makeRestartActivityTask() que hace este propósito exacto.

Cree una intención que pueda usarse para volver a iniciar la tarea * de una aplicación en su estado base.

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

Este método establece Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK como indicadores predeterminados.


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

¿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 ficticia adicional, que se iniciaría desde la primera Actividad, y qué tarea es iniciar una nueva instancia de la misma. O simplemente retrasar la llamada para act.finish() , después de que se inicie el nuevo.

Si necesita salvar la mayor parte del estado, está entrando 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 está llamando desde algún fragmento, hágalo debajo del código.

Intent intent = getActivity().getIntent(); getActivity().finish(); 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); }


Utilicé este código para poder admitir 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()); } } }


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

intenta usar esto ..