Cómo terminar la actividad actual en Android
Tengo una aplicación para Android. Estoy haciendo una pantalla de carga con una barra de progreso.
Ingresé un retraso en el método onCreate. Cuando termine el temporizador, quiero terminar la actividad actual e iniciar una nueva.
Simplemente me da una excepción cuando llama al método finish()
.
public class LoadingScreen extends Activity{ private LoadingScreen loadingScreen; Intent i = new Intent(this, HomeScreen.class); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.loading); CountDownTimer timer = new CountDownTimer(10000, 1000) //10 second Timer { public void onTick(long l) { } @Override public void onFinish() { loadingScreen.finishActivity(0); startActivity(i); }; }.start(); } }
¿Cómo puedo cambiar el código para que termine cuando se hace la barra de progreso?
Si está realizando una pantalla de carga, simplemente configure el parámetro para no guardarlo en la pila de actividades. En su manifest.xml, donde define su actividad:
<activity android:name=".LoadingScreen" android:noHistory="true" ... />
Y en su código no hay necesidad de llamar a .finish () más. Sólo haz startActivity (i);
También no es necesario mantener una instancia de su actividad actual en un campo independiente. Siempre puedes acceder a ella como LoadingScreen.this.doSomething()
lugar de private LoadingScreen loadingScreen;
Intenté usar este ejemplo pero fracasó miserablemente. Cada vez que uso invocar finish () / finishactivity () dentro de un handler, termino con esta amenazante java.lang.IllegalAccess Exception
. No estoy seguro de cómo funcionó para el que planteó la pregunta.
En su lugar, la solución que encontré fue que crear un método en su actividad como
void kill_activity() { finish(); }
Invoque este método desde el interior del método run del manejador. Esto funcionó como un encanto para mí. Espero que esto ayude a alguien que lucha con "cómo cerrar una actividad de un hilo diferente?".
Necesita llamar a finish()
desde el subproceso de interfaz de usuario, no un subproceso de fondo. La forma de hacerlo es declarar un Handler y pedirle al Handler que ejecute un Runnable en el subproceso de UI. Por ejemplo:
public class LoadingScreen extends Activity{ private LoadingScreen loadingScreen; Intent i = new Intent(this, HomeScreen.class); Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler = new Handler(); setContentView(R.layout.loading); CountDownTimer timer = new CountDownTimer(10000, 1000) //10seceonds Timer { @Override public void onTick(long l) { } @Override public void onFinish() { handler.post(new Runnable() { public void run() { loadingScreen.finishActivity(0); startActivity(i); } }); }; }.start(); } }
Simplemente llame al método finish()
:
context.finish();
Cuando desee iniciar una nueva actividad y finalizar la actividad actual, puede hacer lo siguiente:
API 11 o superior
Intent intent = new Intent(OldActivity.this, NewActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent);
API 10 o inferior
Intent intent = new Intent(OldActivity.this, NewActivity.class); intent.setFlags(IntentCompat.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent);
Espero que esto pueda ayudar a alguien =)