2012-07-17 12 views
7

Tengo un servicio que roba un sitio web para obtener datos y, si es necesario, le da una notificación al usuario.Las notificaciones desaparecen tan pronto como finaliza el servicio

El problema que tengo es que las notificaciones desaparecen tan pronto como se cierra el servicio (que podría ser instantáneo). El siguiente código es todo el código de notificación que tiene la aplicación. No he ingresado ningún código para cancelar las notificaciones.

public static void CreateNotificationCompat(int notificationID, String link, String title, String text, Context ctx) 
{ 
    Intent notificationIntent = new Intent("android.intent.action.VIEW", Uri.parse(link)); 
    PendingIntent contentIntent = PendingIntent.getActivity(ctx.getApplicationContext(), 0, notificationIntent, 0); 

    NotificationManager nm = (NotificationManager) ctx 
      .getSystemService(Context.NOTIFICATION_SERVICE); 

    NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx); 
    Resources res = ctx.getResources(); 

    builder.setContentIntent(contentIntent) 
       .setSmallIcon(R.drawable.notify_icon) 
       .setWhen(System.currentTimeMillis()) 
       .setContentTitle(title) 
       .setContentText(text) 
       .setAutoCancel(false); 

    Notification n = builder.getNotification(); 

    nm.notify(notificationID, n); 
} 

Si hace alguna diferencia (bastante seguro de que no lo hace) que estoy usando el contexto de aplicación aquí.

Mis servicios se inician periódicamente, procesa un sitio web, notifica si es necesario y luego se cierra.

Al final de mi servicio en lugar de simplemente llamar a stopSelf() duermo durante aproximadamente 30 segundos y luego llamo a stopSelf(). Entonces la notificación permanece durante 30 segundos y luego desaparece. Nada relevante aparece en Logcat en el momento en que las notificaciones desaparecen.

Solo he podido probar usando ICS hasta ahora.

+0

Esto debería estar bien. En general, las notificaciones solo desaparecerán si su aplicación es asesinada a la fuerza. Esperaría que algo se cuelgue. Sería interesante ver qué código estás usando para "dormir" (¿de verdad le estás diciendo al hilo que duerma?) Y qué hilo se está ejecutando. También sería interesante tratar de eliminar el sueño de los 30s por el bien del experimento y ver si ocurre el mismo comportamiento. – kabuko

+0

¿Dónde está el código que cancela las notificaciones si tiene alguna? Además, para tu información, NO deberías usar cadenas directas como android.intent.action. * Porque esta es una CONSTANTE que está disponible en la clase Intención. @ user1531605 – JoxTraex

+0

Si se solicita que se detenga el servicio "justo antes" de que se publique la notificación, es decir, en la misma cadena de ejecución del código, se borrará la notificación. –

Respuesta

2

Parece que se olvidó primero de verificar el manual del desarrollador. Consulte aquí http://developer.android.com/guide/topics/ui/notifiers/notifications.html y busque los indicadores FLAG_ONGOING_EVENT y FLAG_NO_CLEAR.

Solo he podido probar usando ICS hasta ahora.

Es por eso que los simuladores son bastante útiles. Intentalo. Es parte de SDK.

+0

Lo leí, esos no son lo que quiero. Las notificaciones deben poder borrarse mediante el botón "Borrar notificaciones", por lo que FLAG_NO_CLEAR no será de ayuda. Y este no es un evento continuo. From the docs "No debería establecerse si esta notificación se refiere a algo que sucedió en un momento determinado, como una llamada perdida". Eso es exactamente lo que es esto, una referencia a algo que sucedió en un punto particular en el tiempo. Aunque como nota al margen, hice la prueba con esas banderas por si acaso y tuve los mismos resultados. Las notificaciones aún desaparecieron cuando el servicio se cerró. – user1531605

+0

¿Ha comprobado su código en los androides pre 4.x ?. Emulador es suficiente. –

+0

Publique el código fuente de su Servicio, solo los relevantes, como la creación y la destrucción. – JoxTraex

4

El código que ha publicado funciona. Lo probé tanto en una actividad como en un servicio en jb, y la notificación permanece cuando se detienen los componentes. Incluso verifiqué que podía matar el proceso y la notificación se mantiene. Intenta quitar la aplicación y ver si el problema persiste. Verifique específicamente que no llame por cancelación a la notificación por error.

1

Por favor, intente a la antigua en el mismo dispositivo y nos dicen si se comporta de la misma manera:

private static void CreateNotificationCompat(int notificationID, String link, String title, String text, Context ctx) { 
    String ns = Context.NOTIFICATION_SERVICE; 
    NotificationManager mNotificationManager = (NotificationManager) ctx.getSystemService(ns); 
    Notification notification = new Notification(R.drawable.notify_icon, title, System.currentTimeMillis()); 
    notification.flags = Notification.FLAG_AUTO_CANCEL; 
    PendingIntent contentIntent; 
    Bundle bundle = new Bundle(); 
    Intent notificationIntent = new Intent("android.intent.action.VIEW", Uri.parse(link)); 
    contentIntent = PendingIntent.getActivity(ctx, notificationID, 
       notificationIntent, 0); 
    notification.setLatestEventInfo(ctx, title, text, 
      contentIntent); 
    mNotificationManager.notify(notificationID, notification); 
} 
Cuestiones relacionadas