从Android中的服务发送通知

我有一个服务正在运行,并想发送通知。 太糟糕了,通知对象需要一个上下文,就像一个Activity,而不是一个服务。

你知道有什么方法可以通过吗? 我试图为每个通知bu创build一个Activity,看起来很丑陋,我找不到一个没有任何视图的Activity。

Activity和“ Service实际上都extend Context因此您可以在Service简单地this用作Context

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

从文档中可以看出,这种types的通知已被弃用:

 @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 */ } 

更好的方法
你可以发送这样的通知:

 // 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); 

最好的办法
上面的代码需要最低的API级别11(Android 3.0)。
如果您的最低API级别低于11,则应该使用支持库的NotificationCompat类。

所以如果你的最低目标API级别是4+(Android 1.6+),使用这个:

  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); } 

那么,我不确定我的解决scheme是否是最佳实践。 使用NotificationBuilder我的代码如下所示:

 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()); } 

performance:

  <activity android:name=".MainActivity" android:launchMode="singleInstance" </activity> 

这里的服务:

  <service android:name=".services.ProtectionService" android:launchMode="singleTask"> </service> 

我不知道是否真的有一个singleTaskService但这在我的应用程序正常工作…

如果这些都没有工作,请尝试getBaseContext() ,而不是contextthis