Cómo reiniciar Activity en Android


381

¿Cómo reinicio un Android Activity? Intenté lo siguiente, pero Activitysimplemente se fue.

public static void restartActivity(Activity act){

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

}

99
la actividad se cierra porque usted llamó "act.finish ();" inmediatamente después de crear la actividad ...
Nikhil Dinesh

1
método obsoleto
pedjjj

Respuestas:


623

Hice mi selector de tema así:

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

Básicamente, llamo 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 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 API 10 o inferior. (¡No olvides votar la respuesta de Ralf!)


36
¿Y eso vale la pena votar? Ese no era un requisito mencionado por el OP. De hecho, puede ser deseable.
EboMike

99
Bueno, si no le gusta la animación, puede desactivarla (como lo demostró en su respuesta). Eso no hace que mi respuesta sea incorrecta per se, simplemente no muestra algunas opciones adicionales que puede agregar libremente (y que no se solicitó en la pregunta).
EboMike

28
Creo que te equivocaste. Un voto negativo significa una respuesta incorrecta / incorrecta, y un voto positivo significa que una respuesta es excelente. La cantidad de votos positivos indica qué tan buena es una respuesta en comparación con otras. Puedo ver que estás tratando de promover tu respuesta, pero estás haciendo un mal uso del sistema para ese propósito.
EboMike

8
+1: esto funcionó muy bien para mí y, como usted dice, la animación es algo que quería, por lo que el usuario sabe que se está reiniciando. FWIW, establezco que nunca votar negativamente las respuestas de otros usuarios cuando proporciono una respuesta alternativa a la pregunta, aunque ocasionalmente hago un voto positivo cuando mi respuesta es superada (no digo que sucedió aquí, solo que lo hago) .
Michael Bray

44
EboMike y Ben: Ambas soluciones respondieron a la pregunta del OP. Votar la respuesta de alguien simplemente por razones "estéticas" no es bueno.
Disuadiría a

368

Desde el nivel de API 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 llama a los métodos onSaveInstanceState () y onRestoreInstanceState (), si corresponde.


3
¿Qué pasa si la actividad anterior llamó a esta usando startActivityForResult?
Desarrollador de Android

1
Bueno, es la respuesta correcta si no necesita admitir algo inferior a la API 11.
Edward Falk

@EdwardFalk ¿hay alguna función que lo haga en la biblioteca de soporte?
desarrollador de Android el

2
Esto no funciona en todos los casos. Si tiene un cajón de navegación abierto mientras llama a recreate (), permanecerá abierto cuando se vuelva a crear, lo que significa que guarda el estado, lo que puede no ser deseable.
Chapz

Soy quien no quiere que se salve el estado. A veces las personas solo quieren un reinicio limpio, entonces deberían usar la respuesta de EboMike.
Kimi Chiu

132

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

En HTC Desire, las animaciones aún permanecen (al menos cuando se usan en el método onConfigurationChanged). No ocurren siempre, pero usando el código de EboMike tampoco ocurren siempre.
Juozas Kontvainis

8
Esto no funciona en la actividad principal iniciada por el iniciador. Su actividad terminará oculta debido a algunas de las banderas establecidas en la intención. De lo contrario, funciona bien.
Thomas Ahle

Buen punto. tiene sentido porque llama a finish () desde la actividad base en la pila.
Ben

Llamar a esto mientras cambiamos el tema de la actividad parece resaltar la velocidad (sin animaciones)
Ashok Goli

3
+1 funciona bien, para mí incluso con la actividad principal. Sin embargo, debe llamar overridePendingTransition(0, 0);después finish()y startActivity(), respectivamente, no donde lo llamó ...
caw

115

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

8
La mejor respuesta de todas. Aunque lo creas o no, sigo siendo compatible con dispositivos API 3, y el valor VERSION.SDK_INT requiere API 4. :)
Edward Falk

31

Utilicé este código para poder admitir versiones anteriores de Android y usar recreate()en 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());
        }
    }
}

es un gran trabajo para mi !!
Papo

22

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

20

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

finish();
startActivity(getIntent());

19

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,


1
Creo que el OP quiere reiniciar cualquier actividad, no solo la primera, pero esto fue útil para mí.
Kristopher Johnson

1
Es bueno saber las dos banderas, mi caso parecía no hacer nada sin ellas.
Owen B

1
funcionó gracias a ti! Dios te bendiga .
Vivek

16

Aunque esto ha sido respondido varias veces.

Si reinicia 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 exagerado? Pero la Handlerpublicación le permite llamar a esto en un método de ciclo de vida. He usado esto en onRestart/ onResumemétodos al verificar si el estado ha cambiado entre el usuario que regresa a la aplicación. (instalado algo).

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

No dude en hacer cualquier pregunta.

Saludos, Chris


2
Gran solución y muy buen razonamiento / explicación para el controlador.
JRomero

1
¿Por qué llamas dos veces para "overridePendingTransition"?
Desarrollador de Android el

1
@androiddeveloper No puedo recordar, creo que fue una solución a un error. Puede llamarlo una vez antes de startActivity () y hará lo que se le indicó.
Chris.Jenkins

Después de implementar esto en mi función onResume, el juego se detiene en mi método onStop y tiene una pantalla en negro ... no estoy seguro de por qué
Scumble373

1
Hola Chris, ¿puedes explicar esto un poco más? "Sin el controlador si lo llamas en un lugar extraño, simplemente matará la actividad y no la reiniciará". ?
parvez rafi

15

Bueno, esto no está en la lista, pero una combinación de algunos que ya está publicado:

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

Funciona para mí ... gracias ... pero quiero preguntarte: ¿por qué cuando elimino la primera parte del código (el que verifica el SDK_INT) mi aplicación se ejecuta, relativamente, lento? !! .. cuando vuelvo a adjuntar el código, se ejecuta, relativamente y obviamente, ¡mucho más rápido!
McLan

2
No estoy seguro de eso. Bueno, si está utilizando un SDK que es> = 11, entonces recrear () debería ser más rápido que obtener la intención, terminar y luego comenzar de nuevo. Finish llama al código que se ejecuta en onStop y vuelve a crear el código de ejecución como un cambio de orientación ... por lo que no es tanto como hacer.
Codeversed

4

En combinación con el extraño comportamiento del ciclo de vida de SurfaceView con la cámara . He descubierto que recrear () 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 onResume (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 espero pueda guiar a otros en el futuro porque solucionó los problemas que tenía con SurfaceViews


4

Me pregunto por qué nadie mencionó lo Intent.makeRestartActivityTask()que hace este propósito exacto.

Haga una intención que pueda usarse para relanzar 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_TASKcomo banderas predeterminadas.


3

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

3

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 la orientación cambia, Android generalmente recreará su actividad (a menos que la anule). Este método es útil para rotaciones de 180 grados, cuando Android no recrea su actividad.


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

intenta usar esto ...


3

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

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


1

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

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

Si no lo hace, una posible solución sería usar una actividad ficticia adicional, que se iniciaría desde la primera actividad, y qué trabajo es iniciar una nueva instancia de la misma. O simplemente retrasar la llamada aact.finish() después de que se inicie la nueva.

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 Contexto / Actividad anterior, pasándolo a la nueva instancia.

Por favor, especifique qué está tratando de hacer.


1
Tengo un botón que aplica diferentes temas a la aplicación, después de que se aplica el tema, se guarda con preferencia, la actividad raíz se reinicia, lee el tema de preferencia, aplica el tema en onCreate (). Resulta que el código anterior funciona bien si la actividad no es de instancia única. No estoy seguro si esa es la mejor práctica.

Actualmente, no hay una forma limpia y pavimentada de SDK para reiniciar su actividad, AFAIK: si no pierde nada, puede ser bueno para ir :)
Dimitar Dimitrov

0

Así es como lo hago.

        val i = Intent(context!!, MainActivity::class.java)
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
        startActivity(i)

-1

Si está llamando desde algún fragmento, hágalo a continuación.

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

-4

simplemente puedes usar

onRestart ()

método de la siguiente manera

 @Override
    protected void onRestart() {
        super.onRestart();
        setContentView(R.layout.add_entry);
    }

y llame a onRestart () donde desea reiniciar la actividad actual


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.