只要把这一行:
builder.setAutoCancel(true);
完整的代码是:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(android.R.drawable.ic_dialog_alert); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.co.in/")); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); builder.setContentIntent(pendingIntent); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.misti_ic)); builder.setContentTitle("Notifications Title"); builder.setContentText("Your notification content here."); builder.setSubText("Tap to view the website."); Toast.makeText(getApplicationContext(), "The notification has been created!!", Toast.LENGTH_LONG).show(); NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); builder.setAutoCancel(true); // Will display the notification in the notification bar notificationManager.notify(1, builder.build());
在使用Lollipop的Heads Up Display通知时发现这是一个问题。看到 设计指南 。这是要实现的完整(ish)代码。
到目前为止,拥有一个“关闭”按钮并不重要,但现在它更像是在你面前。
的 建立通知 强>
int notificationId = new Random().nextInt(); // just use a counter in some util class... PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notificationId, context); NotificationCompat.Builder builder = new NotificationCompat.Builder(context); builder.setPriority(NotificationCompat.PRIORITY_MAX) //HIGH, MAX, FULL_SCREEN and setDefaults(Notification.DEFAULT_ALL) will make it a Heads Up Display Style .setDefaults(Notification.DEFAULT_ALL) // also requires VIBRATE permission .setSmallIcon(R.drawable.ic_action_refresh) // Required! .setContentTitle("Message from test") .setContentText("message") .setAutoCancel(true) .addAction(R.drawable.ic_action_cancel, "Dismiss", dismissIntent) .addAction(R.drawable.ic_action_boom, "Action!", someOtherPendingIntent); // Gets an instance of the NotificationManager service NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); // Builds the notification and issues it. notifyMgr.notify(notificationId, builder.build());
的 NotificationActivity 强>
public class NotificationActivity extends Activity { public static final String NOTIFICATION_ID = "NOTIFICATION_ID"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); manager.cancel(getIntent().getIntExtra(NOTIFICATION_ID, -1)); finish(); // since finish() is called in onCreate(), onDestroy() will be called immediately } public static PendingIntent getDismissIntent(int notificationId, Context context) { Intent intent = new Intent(context, NotificationActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.putExtra(NOTIFICATION_ID, notificationId); PendingIntent dismissIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); return dismissIntent; } }
的 AndroidManifest.xml中 强> (防止SystemUI聚焦到后台堆栈所需的属性)
<activity android:name=".NotificationActivity" android:taskAffinity="" android:excludeFromRecents="true"> </activity>
在新的API中不要忘记TAG:
notify(String tag, int id, Notification notification)
并相应地
cancel(String tag, int id)
代替:
cancel(int id)
https://developer.android.com/reference/android/app/NotificationManager
当您在通知管理器上调用notify时,您为其指定了一个id - 这是您稍后可以用来访问它的唯一ID(来自通知管理器:
notify(int id, Notification notification)
要取消,您可以致电:
具有相同的ID。那么,基本上,你需要跟踪id或者可能将id放入你添加到PendingIntent里面的Intent的Bundle中?
你可以随时 cancel() 该 Notification 从动作调用的任何内容(例如,在 onCreate() 与之相关的活动 PendingIntent 你供应给 addAction() )。
cancel()
Notification
onCreate()
PendingIntent
addAction()
在我的使用中的意见 BroadcastReceiver 是一种取消通知的更简洁方法:
BroadcastReceiver
在AndroidManifest.xml中:
<receiver android:name=.NotificationCancelReceiver" > <intent-filter android:priority="999" > <action android:name="com.example.cancel" /> </intent-filter> </receiver>
在java文件中:
Intent cancel = new Intent("com.example.cancel"); PendingIntent cancelP = PendingIntent.getBroadcast(context, 0, cancel, PendingIntent.FLAG_CANCEL_CURRENT); NotificationCompat.Action actions[] = new NotificationCompat.Action[1]; NotificationCancelReceiver public class NotificationCancelReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //Cancel your ongoing Notification }; }