Recargar actividad en Android


220

¿Es una buena práctica volver a cargar un Activityen Android ?

¿Cuál sería la mejor manera de hacerlo? this.finishy luego this.startActivitycon la actividad Intent?


3
No soy un desarrollador experimentado de Android, pero reiniciar una actividad parece un mal diseño y solo debería hacerse en casos extremos.
Hudson

@ Hudson Es lo que sucede en los cambios de configuración. Si ese es un buen diseño o no, es otra discusión completamente. ;)
hpique

1
@Hudson Así que ahora tienes 5 años de experiencia desarrollador: D
Pratik Butani

@PratikButani, ¿te conozco? :) Tengo como 8 años de experiencia ahora, pero no mucho en el desarrollo de Android.
Hudson

Visitaste mi perfil Lo sé: P @Hudson
Pratik Butani

Respuestas:


521

Simplemente puedes usar

finish();
startActivity(getIntent());

para refrescar un Activitydesde dentro de sí mismo.


2
¿Qué pasa si no se puede llamar dentro de la clase de actividad ?, ¿alguna forma de hacerlo con la referencia de contexto?
giorgilina

1
@giorgiline: sí, cree una interfaz que defina dentro de la clase de actividad y pase esa interfaz como parámetro a cualquier clase externa desde la que la esté utilizando.
agregado1166877

1
Wow, NO pensé que sería tan fácil.
theblang

1
¿Cómo puede lidiar con una actividad que se inició para obtener resultados? ¿Puedes reiniciar eso con la persona que llama original que aún recibe un resultado?
Tothphu

1
@tothphu: aunque no lo intenté, pero en teoría creo que sí. Sin embargo, la segunda vez que finaliza la actividad, no devolverá el resultado a la Actividad que la creó por primera vez.
Sush

64

para aquellos que no quieren ver ese parpadeo después del método recreate () simplemente use

 finish();
 overridePendingTransition(0, 0);
 startActivity(getIntent());
 overridePendingTransition(0, 0);

2
¡Increíble! ¡Quería anular la transición para que el usuario no se dé cuenta!
Ceddy Muhoza

¡Gran trabajo! El usuario apenas notaría la recarga.
Sam

38

Esto es lo que hago para volver a cargar la actividad después de cambiar el regreso de un cambio de preferencia.

@Override
protected void onResume() {

   super.onResume();
   this.onCreate(null);
}

Esto esencialmente hace que la actividad se vuelva a dibujar.

Actualizado: Una mejor manera de hacer esto es llamar al recreate()método. Esto hará que la actividad sea recreada.


15
Eso podría estar funcionando, pero no se recomienda llamar explícitamente a los métodos de ciclo de vida.
ITisha

Si toma esta ruta, debe usar un método init () separado que configura todo y lo llama desde onCreate () y onResume (), en lugar de llamar a onCreate ().
Tom

1
Gran solución, excepto que no funcionará en algunas situaciones cuando sus métodos de ciclo de vida se utilizan para otras cosas. Por ejemplo, estoy accediendo a la cámara del teléfono, y cuando se toma la foto, la pantalla vuelve a mi actividad para publicarla en una vista. Al usar métodos de ciclo de vida para actualizar, me expulsan del proceso de la cámara y mi foto no vuelve a la actividad, sino que la obtengo desde el principio. Solo un ejemplo a tener en cuenta.
Azurespot

1
Es importante tener en cuenta el modo de lanzamiento de la actividad al usar recreate (). Por ejemplo, cuando llamo a recreate () en una actividad con launchMode = singleTop, no veo que onCreate () se llame después. OTOH, si, en lugar de llamar a recreate (), llamo explícitamente finish () y seguido de startActivity (), veo que onCreate () se llama después.
albert c braun

14

Vi respuestas anteriores que se han dado para recargar la actividad usando Intent. Esos funcionarán, pero también puede hacer lo mismo usando el método recreate () dado en la clase Activity en sí.

En lugar de escribir esto

// Actualizar la actividad principal al cerrar el cuadro de diálogo

Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish();

Esto se puede hacer escribiendo esto solamente

recreate();

recreate()fue la solución para mí: "reiniciar" la actividad no funcionó para mí, ya que comencé la actividad usando "StartActivityForResult" y rompió el comportamiento.
KYL3R


10

Necesitaba actualizar una lista de mensajes en una de mis aplicaciones a toda prisa, así que simplemente realicé una actualización de mi actividad principal de la interfaz de usuario antes de cerrar el diálogo en el que estaba. Estoy seguro de que también hay mejores maneras de lograr esto.

// Refresh main activity upon close of dialog box
Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish(); //

9

Android incluye un sistema de gestión de procesos que maneja la creación y destrucción de actividades que niega en gran medida cualquier beneficio que pueda ver al reiniciar manualmente una actividad. Puede ver más información al respecto en Fundamentos de la aplicación

Sin embargo, lo que es una buena práctica es asegurarse de que sus métodos onPause y onStop liberen todos los recursos que no necesita conservar y utilizar onLowMemory para reducir sus necesidades de actividades al mínimo absoluto.


2
+1 por mencionar en LowLemory. ¡No sabía que ese método existía!
hpique 01 de

4

Comience con una intención igual activityy cierre el activity.

Intent refresh = new Intent(this, Main.class);
startActivity(refresh);//Start the same Activity
finish(); //finish Activity.

4

en algunos casos es la mejor práctica en otros, no es una buena idea que esté basada en el contexto si elige hacerlo, usar la siguiente es la mejor manera de pasar una actividad a sus hijos:

    Intent i = new Intent(myCurrentActivityName.this,activityIWishToRun.class);    
    startActivityForResult(i, GlobalDataStore.STATIC_INTEGER_VALUE);

la cosa es que cuando terminas () de la actividad IWishToRun vuelves a tu actividad vital


1
¡Esto es quizás viejo pero me has ahorrado mucho tiempo! :)
Lior Iluz

4

Recargar toda su actividad puede ser una tarea pesada. Simplemente ponga la parte del código que debe actualizarse ( kotlin ):

override fun onResume() {
    super.onResume()
    //here...
}

Java:

@Override
public void onResume(){
    super.onResume();
    //here...

}

Y llame a " onResume () " cuando sea necesario.


2

No creo que sea una buena idea ... sería mejor implementar un método más limpio. Por ejemplo, si su actividad contiene un formulario, el método más limpio podría borrar cada widget en el formulario y eliminar todos los datos temporales. Supongo que eso es lo que quieres: restaurar la actividad a su estado inicial.


En realidad, quiero cambiar el estado de la aplicación y luego volver a cargar la actividad para reflejar el cambio.
hpique

¿Cuál es el "estado de la aplicación" en su caso? Preferencias
zehrer

2

Después de experimentar con esto por un tiempo, no he encontrado consecuencias inesperadas de reiniciar una actividad. Además, creo que esto es muy similar a lo que Android hace de forma predeterminada cuando cambia la orientación, por lo que no veo una razón para no hacerlo en una circunstancia similar.


Por el contrario, intenté "actualizar" mi pantalla reiniciando la actividad. No aparece en la superficie nada salió mal, mi información se actualizó como quería, el LogCat cuenta una historia diferente. En LogCat, vuelvo al método onCreate de la actividad, intenta extraer preferencias. 1.er intento Recibo una excepción de puntero nulo, luego intenta nuevamente comenzar en onCreate y recibe el almacenadoPref la segunda vez. No estoy seguro de lo que está sucediendo aquí, pero solo quería asegurarme de que no estuvieras simplemente mirando el resultado, porque WYSIWIG no era el caso para mí.
taraloca

¿Cómo exactamente estás reiniciando la actividad?
hpique

2

yo tengo el mismo problema

import android.support.v4.content.IntentCompat;

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

Este código funciona para mí. Android api 17


2

En una actividad puede llamar recreate()para "recrear" la actividad (API 11+)


1

Tuve otro enfoque como: establecer la launchModeactividad de mi singleTopy sin llamar finish(), simplemente startActivity(getIntent())hará el trabajo. Solo hay que preocuparse por los nuevos datos tanto en onCreate()como onNewIntent. Con el estilo de Sush, la aplicación puede parpadear como dijo AMAN SINGH. Pero el enfoque de AMAN SINGH seguirá creando una nueva actividad que de alguna manera es innecesaria, incluso si soluciona el problema del "parpadeo", creo.

Demasiado tarde para esta pregunta, pero si alguien busca una solución, aquí está.


0

Después de iniciar sesión tuve el mismo problema, así que usé

@Override
protected void onRestart() {
    this.recreate();
    super.onRestart();
}


0

para mí está funcionando, no está creando otras intenciones y en la misma se cargaron las nuevas intenciones.

    overridePendingTransition(0, 0);
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
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.