2009-04-07 12 views
6

Tengo dos actividades de reproducción: mainActivity y childActivity. Cuando el usuario hace clic en el botón mainActivity, se inicia childActivity. Lo que quiero hacer es lo siguiente:Android: Restauración de la actividad activa, mientras que la reanudación de la aplicación

Cuando la actividad activo es el childActivity y el usuario hace clic en el botón de inicio y luego relanzar la aplicación, quiero ver el childActivityen lugar demainActivity que se lanzó

Tenía algunas sugerencias que realmente daban vueltas. Intenté manipular los eventos onStart, onRestart, onResume, onStop, onDestroy. Pero, no resolvieron completamente el problema. Debería haber una manera inteligente de salir. Gracias.

Editar:

Gracias por la respuesta, Soonil. El caso que dijo está sucediendo cuando se llama a la actividad desde la ventana de actividades recientes. (la ventana se abre cuando presiona prolongadamente el botón de inicio) Sin embargo; Esto no sucede cuando lo abre desde la pantalla de inicio. (como abrir desde el principio) No creo que mi código tenga un problema específico para generar este error. Porque, creé un proyecto de prueba y probé de forma autónoma antes de enviar la pregunta y me enfrenté al mismo problema. De todos modos, aquí está el código de prueba:

public class MainActivity extends Activity implements OnClickListener { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     this.setTitle("MainActivity"); 

     ((Button) findViewById(R.id.btnChildActivity)).setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 
     startActivity(new Intent(this, ChildActivity.class)); 
    } 

} 

public class ChildActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main2); 
     this.setTitle("ChildActivity"); 

    } 
} 
+0

Simplemente ejecute su ejemplo sin ningún problema. La secuencia que tomé: iniciar la aplicación (ahora en la pantalla MainActivity), presionar el botón (ChildActivity se inicia), presionar el botón de inicio (ahora en la pantalla de inicio), presionar long home y seleccionar MainActivity (terminar en ChildActivity), presionar atrás (terminar en MainActivity) – sooniln

+1

Ok. esto es lo que estoy esperando también Pero, ¿qué hay de ejecutar la aplicación desde la pantalla de inicio? (no se ejecuta desde el menú de la aplicación reciente cuando presiona prolongadamente el botón de inicio, pero desde la pantalla de inicio). Espero ver mi ChildActivity. Sin embargo; MainActivity se está lanzando. Gracias. –

+0

Lo sentimos, sigue el mismo resultado :(Presione el botón de la aplicación en la pantalla de inicio (en MainActivity), presione el botón (en ChildActivity), presione home (en la pantalla de inicio), presione el botón de la aplicación en la pantalla de inicio (en ChildActivity), presione atrás MainActivity). ¿Desea que su aplicación siempre se inicie en la pantalla de ChildActivity? – sooniln

Respuesta

3

EDITAR: Se encuentra la solución a su problema hoy en día un tanto al azar! Vea esto error report. Explica tu problema exactamente. La razón por la que no pude reproducir el problema es que nunca antes le pedí a Eclipse que iniciara una aplicación. Uso Eclipse para instalar la aplicación y luego la inicio yo mismo.


Esto ya es el comportamiento predeterminado para las aplicaciones de Android, no se requieren trucos especiales para lograrlo. Me sorprende que su aplicación no demuestre este comportamiento. Cada aplicación de Android mantiene una pila de actividades, literalmente una pila de actividades LIFO. Estas actividades se pueden agrupar en tareas, pero el 99% de las aplicaciones mundanas nunca necesitarán saber nada sobre tareas en mi experiencia.

Cuando presiona el botón de inicio, toda la pila de la aplicación se pone en segundo plano. Mientras está en segundo plano, puede matarlo por problemas de memoria en cualquier momento, pero si no pasa mucho tiempo antes de que se restaure, generalmente no se elimina y no tiene que volverse a crear. Cuando selecciona la aplicación nuevamente, la pila (o más exactamente, solo el elemento superior en la pila) se restaura.

Si su aplicación no muestra este comportamiento, sospecho que tiene algo que ver con la forma en que está iniciando mainActivity y childActivity y cualquier indicador adicional de intención que pueda estar usando. ¿Hay alguna posibilidad de que pueda publicar fragmentos de código sobre cómo está iniciando la actividad principal y la actividad infantil?

+0

Tienes razón. Después de que firmé mi aplicación de prueba e instalarlo en G1 y ejecutar, vi el comportamiento correcto que espero ver. Lo siguiente que voy a hacer es limpiar mi código de guardar/restaurar estados y volver a ejecutar en mi dispositivo. Muchas gracias por su ayuda. :) –

+0

Pronto, quiero hacerle una pregunta no relacionada. ¿Utiliza script automatizado para construir y exportar su aplicación? Si es así, ¿cómo haces eso? No pude entender la exportación específicamente para Android. Gracias. –

+0

He considerado moverme para usar ANT para compilar, pero por el momento Eclipse hace todo lo que necesito. Solo uso algunas secuencias de comandos para que la firma de una aplicación sea un poco más fácil. Puede encontrar una explicación bastante buena de un proceso de publicación simplificado en http://developer.android.com/guide/publishing/app-signing.html – sooniln

-1

Volví y probé con una aplicación similar, e incluso cuando el proceso se ve forzado a salir de la memoria, ChildActivity se reconstituye automáticamente como dice Soonil. ¿Estás viendo esto en el emulador o en un dispositivo real?

Si ejecuta su aplicación y ver Logcat, debería ver algo como lo siguiente después de iniciar su aplicación, a continuación, abra la ChildActivity y haga clic en Inicio y luego lanzar su actividad nuevamente:

la actividad de inicio: Intención {acción = android.intent.action.MAIN categories = {android.intent.categroy.LAUNCHER} flags = ... comp = {com.yourpackagename.MainActivity}} Inicie el proceso para la actividad yourpackagename.ChildActivity: pid = x uid = y gids = {} actividad visualizada /.Actividades de niño

¿Podría publicar el resultado de logcat cuando no vea el comportamiento que espera?

+0

AFAIK esto es inexacto. Cuando se mata un proceso y se reinician las actividades, se guarda la pila de actividades. Cada actividad debe serializar información solo sobre su propio estado. El estado de la pila de actividad global es mantenido por el sistema. (Eliminaré mi voto negativo si me puedes vincular con la prueba) – sooniln

Cuestiones relacionadas