Answers:
当您在通知管理器上调用notify时,您给了它一个ID-这是您以后可以用来访问它的唯一ID(来自通知管理器:
notify(int id, Notification notification)
要取消,您可以致电:
cancel(int id)
具有相同的ID。因此,基本上,您需要跟踪ID或将ID放入添加到PendingIntent内部的Intent中的Bundle中?
发现使用Lollipop的抬头显示通知时这是一个问题。请参阅设计准则。这是要实现的完整代码。
到目前为止,“关闭”按钮的重要性并不高,但现在更多的是面对您。
建立通知
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>
我发现,当您在展开的通知中使用操作按钮时,必须编写额外的代码,而且更加受约束。
用户单击操作按钮时,必须手动取消通知。该通知仅针对默认操作自动取消。
同样,如果您从按钮启动广播接收器,通知抽屉也不会关闭。
我最终创建了一个新的NotificationActivity来解决这些问题。这种没有任何UI的中介活动会取消通知,然后启动我真正想从通知开始的活动。
我已经在相关文章中发布了示例代码。单击Android Notification Actions不会关闭Notification抽屉。
我认为使用a 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
};
}
intent.putExtra()
并将其输入BroadcastReceiver
您可以随时cancel()
在Notification
从任何正在被调用的动作(例如,在onCreate()
活动捆绑到的PendingIntent
您提供的addAction()
)。
cancel()
获取Notification
您在调用时使用的ID notify()
。您不需要该Notification
对象。
ACTION_VIEW
并且类型是image/jpeg
(与另一个应用共享图像),那么该取消应该如何触发?IMO Android应该自动取消,我为Android为什么不只照顾它而感到困惑?
Notification
-related中的第三方应用程序PendingIntent
,但这并不是它设计的工作原理,因此您会遇到类似这样的问题。“ IMO Android应该自动取消”-我可以看到在操作中为此提供了一个标志,但是这并不是一件永久的事情。如果是这样,则跳过音乐播放器通知中的曲目将关闭该通知。
在新的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
cancel()
函数有2个实现;一种带TAG,另一种不带TAG。但是我们必须提供一个TAG
。这是cancel
docs的功能public void cancel(@Nullable String tag, int id)
。上次在Android Q上查看
只需把这一行:
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());