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?

hpique
fuente
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.

Sush
fuente
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);
AMAN SINGH
fuente
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.

Kingargyle
fuente
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();
Rizwan
fuente
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
13

simplemente use

this.recreate();

esto activará el método onCreate en la actividad

Yasiru Nayanajith
fuente
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(); //
novecientos
fuente
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.

Al Sutton
fuente
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.
Jorgesys
fuente
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

yoav.str
fuente
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.

se convirtió en humano
fuente
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.

Cristian
fuente
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.

hpique
fuente
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

Adnan Abdollah Zaki
fuente
2

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


fuente
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á.

CAMINANTE
fuente
0

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

@Override
protected void onRestart() {
    this.recreate();
    super.onRestart();
}
Rajnish Sharma
fuente
0

Utilicé esto y funciona bien sin finish()

startActivity(getIntent());
Hocine Kheddadji
fuente
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);
Anil Kumar
fuente