从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>
我不知道是否真的有一个singleTask
在Service
但这在我的应用程序正常工作…
如果这些都没有工作,请尝试getBaseContext()
,而不是context
或this
。