Enviar una notificación de un servicio en Android

Tengo un servicio en ejecución y me gustaría enviar una notificación. Lástima, el objeto de notificación requiere un Context , como una Activity , y no un Service .

¿Conoces alguna forma de pasar eso? Traté de crear una Activity para cada notificación, pero parece feo y no puedo encontrar una forma de iniciar una Activity sin ninguna View .

Tanto la Activity como el Service realidad extend Context para que simplemente pueda usar this como su Context dentro de su Service .

 NotificationManager notificationManager = (NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE); Notification notification = new Notification(/* your notification */); PendingIntent pendingIntent = /* your intent */; notification.setLatestEventInfo(this, /* your content */, pendingIntent); notificationManager.notify(/* id */, notification); 

Este tipo de notificación está en desuso como se ve en los documentos:

 @java.lang.Deprecated public Notification(int icon, java.lang.CharSequence tickerText, long when) { /* compiled code */ } public Notification(android.os.Parcel parcel) { /* compiled code */ } @java.lang.Deprecated public void setLatestEventInfo(android.content.Context context, java.lang.CharSequence contentTitle, java.lang.CharSequence contentText, android.app.PendingIntent contentIntent) { /* compiled code */ } 

Mejor manera
Puede enviar una notificación como esta:

 // prepare intent which is triggered if the // notification is selected Intent intent = new Intent(this, NotificationReceiver.class); PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0); // build notification // the addAction re-use the same intent to keep the example short Notification n = new Notification.Builder(this) .setContentTitle("New mail from " + "test@gmail.com") .setContentText("Subject") .setSmallIcon(R.drawable.icon) .setContentIntent(pIntent) .setAutoCancel(true) .addAction(R.drawable.icon, "Call", pIntent) .addAction(R.drawable.icon, "More", pIntent) .addAction(R.drawable.icon, "And more", pIntent).build(); NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); notificationManager.notify(0, n); 

Mejor manera
El código anterior necesita un nivel API mínimo de 11 (Android 3.0).
Si su nivel mínimo de API es menor que 11, debe usar la clase NotificationCompat de la biblioteca de soporte de esta manera.

Entonces, si su nivel de API objective mínimo es 4+ (Android 1.6+), use esto:

  import android.support.v4.app.NotificationCompat; ------------- NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.mylogo) .setContentTitle("My Notification Title") .setContentText("Something interesting happened"); int NOTIFICATION_ID = 12345; Intent targetIntent = new Intent(this, MyFavoriteActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, targetIntent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(contentIntent); NotificationManager nManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); nManager.notify(NOTIFICATION_ID, builder.build()); 
 @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public void PushNotification() { NotificationManager nm = (NotificationManager)context.getSystemService(NOTIFICATION_SERVICE); Notification.Builder builder = new Notification.Builder(context); Intent notificationIntent = new Intent(context, MainActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(context,0,notificationIntent,0); //set builder.setContentIntent(contentIntent); builder.setSmallIcon(R.drawable.cal_icon); builder.setContentText("Contents"); builder.setContentTitle("title"); builder.setAutoCancel(true); builder.setDefaults(Notification.DEFAULT_ALL); Notification notification = builder.build(); nm.notify((int)System.currentTimeMillis(),notification); } 

Bueno, no estoy seguro de si mi solución es la mejor práctica. Usando NotificationBuilder mi código es así:

 private void showNotification() { Intent notificationIntent = new Intent(this, MainActivity.class); PendingIntent contentIntent = PendingIntent.getActivity( this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(contentIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(NOTIFICATION_ID, builder.build()); } 

Manifiesto:

   

y aquí el Servicio:

    

No sé si realmente hay un servicio singleTask en el Service pero esto funciona correctamente en mi aplicación …

Si ninguno de estos funciona, intente getBaseContext() , en lugar de context o this .