2011-02-15 20 views
59

Tengo una aplicación de Android. Estoy haciendo una pantalla de carga con una barra de progreso.Cómo finalizar la actividad actual en Android

Ingresé un retraso en el método onCreate. Cuando el temporizador finaliza, quiero finalizar la actividad actual y comenzar una nueva.

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 finalice cuando se completa la barra de progreso?

+1

intente loadingScreen.finish(); – sat

+0

esto resolvió mi problema http://stackoverflow.com/questions/23574666/countdowntimer-inside-popup – Sam

Respuesta

108

Si está haciendo una pantalla de carga, simplemente configure el parámetro para no mantenerlo en la pila de actividades. En su manifest.xml, donde se define la actividad de hacer:

<activity android:name=".LoadingScreen" android:noHistory="true" ... /> 

Y en su código que no hay necesidad de llamar a .finish() nunca más. Simplemente inicie Activity (i);

Tampoco es necesario mantener una instancia de su actividad actual en un campo separado. Siempre se puede acceder como LoadingScreen.this.doSomething() en lugar de private LoadingScreen loadingScreen;

+0

Con este parámetro, finaliza la actividad con startActivity y también con startActivityForResult. Me pica hoy; D – Zhen

10

Debe llamar al finish() desde el hilo de la interfaz de usuario, no a un hilo de fondo. La forma de hacerlo es declarar un controlador y pedirle al controlador que ejecute Runnable en el hilo de la interfaz de usuario. 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(); 
    } 
} 
+0

@AndreiBuneyeu - Hay una regla general (declarada [aquí] (http://developer.android.com/guide/components/processes-and-threads.html#Threads)): "No acceder al kit de herramientas de la interfaz de usuario de Android desde fuera del hilo de la interfaz de usuario ".Si bien el término "kit de herramientas de la interfaz de usuario de Android" no está definido en ningún lugar de los documentos (que pude encontrar), parece razonable considerar que los métodos del ciclo de vida de la actividad forman parte de él. (Claramente, algunos métodos de 'Actividad', como' Activity.runOnUiThread (Runnable) '--no entran dentro de esta restricción. Estoy de acuerdo con usted en que los documentos no son tan claros como deberían estar sobre este tema) –

42

Intenté utilizar este ejemplo pero falló miserablemente. Cada vez que uso para invocar finish()/finishactivity() dentro de un controlador, termino con este amenazante java.lang.IllegalAccess Exception. No estoy seguro de cómo funcionó para quien hizo la pregunta.

En cambio, la solución que encontré fue que crear un método en su actividad como

void kill_activity() 
{ 
    finish(); 
} 

invocar este método desde dentro del método run del manipulador. Esto funcionó como un encanto para mí. Espero que esto ayude a cualquiera a luchar con "cómo cerrar una actividad desde un hilo diferente".

+3

Esta es una pregunta, no una respuesta. – untill

8

Sólo tiene que llamar la finish() método:

context.finish(); 
+1

¿qué método de acabado? No veo ningún método this.finish() en la actividad – nurettin

6

Cuando se desea iniciar una nueva actividad y terminar la actividad actual se puede hacer esto:

API 11 o mayor API

Intent intent = new Intent(OldActivity.this, NewActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
startActivity(intent); 

10 o menos

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

Cuestiones relacionadas