2010-08-25 20 views
7

Sé que hay varias preguntas de este tipo, pero probé todas y todavía no funciona.
Ok, para mi aplicación; Tengo una actividad. En esta actividad, hay 4 pestañas, y la cuarta contiene una lista y un botón de grabación. Cuando estoy presionando grabar, hay un escucha de GPS que comienza. Después de obtener un nuevo valor de gps, lo introduce en la lista.
¡Esto funciona hasta ahora!
Si hago clic en el botón de inicio, todavía funciona, si lo presiono mucho, entonces. Se reanuda esa actividad con la pestaña específica abierta y la lista todavía contiene los elementos de lista y el oyente GPS sigue activo.
¡Esto también funciona bien!
Ahora quería agregar una notificación, que muestra el recuento de valores gps de la lista como .number. En cada nueva señal gps, actualiza el icono de notificación con el nuevo número. Esto no es un problema, pero la acción de hacer clic en la notificación arruina totalmente mi aplicación.Actividad de currículum de notificaciones

El código real se ve así:

public void callNotify(String text) { 
    notif = new Notification(); 
    Intent contentIntent = new Intent(this, tabactivity.class); 
    contentIntent.putExtra("fid", this.specialvalue); 
    contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
     | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    notif.icon = R.drawable.icon; 
    notif.setLatestEventInfo(this, getString(R.string.app_name), text, 
     PendingIntent.getActivity(this.getBaseContext(), 0, contentIntent, 
      PendingIntent.FLAG_UPDATE_CURRENT)); 
    notif.ledARGB = Color.RED; 
    notif.ledOnMS = 200; 
    notif.ledOffMS = 200; 
    notif.flags = Notification.FLAG_SHOW_LIGHTS 
     | Notification.FLAG_ONGOING_EVENT 
     | Notification.FLAG_ONLY_ALERT_ONCE; 
    notif.number = notifyNumber; 
    mNotificationManager.notify(notifyNumber, notif); 
} 

public void updateNotify(String text) { 
    notifyNumber++; 
    notif.number = (int) (notifyNumber/2); 
    Intent contentIntent = new Intent(this, tabactivity.class); 
    contentIntent.putExtra("fid", this.specialvalue); 
    contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
     | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    notif.setLatestEventInfo(this, getString(R.string.app_name), text, 
     PendingIntent.getActivity(this.getBaseContext(), 0, contentIntent, 
      PendingIntent.FLAG_UPDATE_CURRENT)); 
    mNotificationManager.cancel((notifyNumber - 2)); 
    mNotificationManager.notify(notifyNumber, notif); 
} 

Así, el updateNotify() es llamado en una nueva señal de GPS. Y el callNotify() es el primero, antes de que comience el oyente gps. Y, sí, el notifyNumber/2 fue mi intención, porque trabajo con ese número aún más.

Si lo compilo de esta manera y hago clic en Notificación, se abre una NUEVA tabactividad en la primera pestaña. Si hago clic atrás, recibo muchos errores (la base de datos sigue abierta, los nullpointers y demás). Creo que porque comienza una nueva tabactividad y la otra todavía está abierta, porque puedo ver que el oyente GPS todavía está funcionando.

Entonces, lo que quiero es que pueda hacer lo siguiente: Abro mi aplicación, voy a la tabactividad, abro la pestaña 4, hago clic en grabar. Si hago clic atrás, debería ocultar la aplicación, también, si solo hago clic en el botón de inicio. Pero hay una notificación. Si hago clic en esa, solo debería mostrar la actividad oculta nuevamente y eso es todo. Entonces, ¿qué estoy haciendo mal allí? Pensé, las banderas FLAG_ACTIVITY_CLEAR_TOP y FLAG_ACTIVITY_SINGLE_TOP deberían resolver el problema?

Respuesta

6

Lo que está sucediendo aquí es un poco confuso, así que tengan paciencia conmigo aquí.

FLAG_ACTIVITY_SINGLE_TOP de acuerdo con los documentos If set, the activity will not be launched if it is already running at the top of the history stack. Entonces, si la actividad actual no está en la parte superior de la pila del historial, se relanzará.

FLAG_ACTIVITY_CLEAR_TOP de nuevo de los documentos If set, and the activity being launched is already running in the current task, then instead of launching a new instance of that activity, all of the other activities on top of it will be closed and this Intent will be delivered to the (now on top) old activity as a new Intent.

Por defecto, el TabActivity será siempre abierto a la pestaña 0, puede utilizar setDefaultTab cambiar eso a través de código. Cada pestaña en el TabHost es también un nuevo Intent

Si compilo como este, y haga clic en en la notificación, se abre una nueva tabactivity en la primera pestaña. Si yo hago clic en ese momento, recibo muchos errores (la base de datos sigue abierta, nullpointers y esas cosas).

Esto está sucediendo creo porque la corriente es Intent TAB4 (en realidad su # 3, 0,1,2,3) y su notificación es la educación de la tabactivity.class.Como no está activo o en la parte superior de la pila, todos los actos que se encuentran encima están cerrados, incluida tab4.

Por lo tanto, lo que quiero decir, que pueda hacer el siguiente: Abro la aplicación, vaya a la tabactivity, 4 pestaña abierta, haga clic en Registro. Si hago clic atrás, debe ocultar la aplicación, también, si solo hago clic en el botón de inicio . Pero hay una notificación . Si hago clic en ese, debería mostrar la actividad oculta otra vez y eso es todo. Entonces, ¿qué estoy haciendo mal allí? Pensé, las banderas FLAG_ACTIVITY_CLEAR_TOP y FLAG_ACTIVITY_SINGLE_TOP deberían resolver el problema?

Usted está confundiendo lo que las banderas hacen y lo que sucede con las teclas home y back. Al pulsar home se ocultará su actividad y la notificación debería funcionar bien con esos indicadores (una vez que solucione el problema que mencioné anteriormente). Sin embargo, cuando tocas back, Android finaliza el actual Activity y lo saca de la pila. Como no hay nada debajo, se ve obligado a reiniciar desde cero cuando presiona la notificación.

+1

Bueno, en realidad sé, por qué está saltando en la primera pestaña. La Tabactivity comienza usualmente en la primera pestaña, pero la cuarta pestaña tiene esa lista de gps. Entonces, para mí, lógicamente, está abriendo la tabactividad dos veces. Porque los datos iniciales de la lista y cosas no se cargan en ese momento. Entonces, ¿las banderas están equivocadas? No lo entiendo de alguna manera ... –

+2

Oh, espera ... parece que funciona, si solo uso FLAG_ACTIVITY_SINGLE_TOP y no ambos. Ok, si ese fue el error, no entiendo por completo los documentos. ¡Lo siento! –

Cuestiones relacionadas