Android:当您的应用在后台运行时,在通知上使用自动取消

2022-09-02 09:11:25

我在这里看了所有其他自动取消不起作用的问题,它们似乎都涉及我没有犯的错误。我都试过了

builder.setAutoCancel(true);

Notification notif = builder.build();
notif.flags |= Notification.FLAG_AUTO_CANCEL;

两者都不起作用。

我正在使用 NotificationCompat,因为我的最低 API 是 8。这是我的完整代码。在此特定通知中,我不是在调用意图,因为我不需要用户执行任何操作。

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentTitle(getString(R.string.app_name) + ": my title");
builder.setContentText(message);
builder.setSmallIcon(R.drawable.notification_icon);

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.prog_icon);
builder.setLargeIcon(bitmap);

builder.setAutoCancel(true); // dismiss notification on user click

NotificationManager notiManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notiManager.notify(MY_NOTI_MANAGER_ID, builder.build());

通知显示得非常完美。您可以滑动以清除它。但是,仅点击它不会关闭通知。它只是点亮并留在那里。

我的代码与此处发布的其他人之间的一些可能差异:1)我正在使用AdmitIngCompat(这应该不会有什么不同,但我们以前听说过)。2)由于我的通知很简单,因此我不附加意图。

如果您有任何见解,请告诉我。

编辑:我的目的是在不使我的后台应用处于前台的情况下关闭通知。


答案 1

因此,显然您确实需要一个待定的意图。

Android - 通知管理器中,在没有意图的情况下收到通知,我找到了一种解决方案,该解决方案将当前活动的应用程序抓取为待处理的意图(这样您就不必为了消除通知而启动自己的活动)。

我刚刚添加了以下两行代码(在设置自动取消之后):

PendingIntent notifyPIntent = 
    PendingIntent.getActivity(getApplicationContext(), 0, new Intent(), 0);     
builder.setContentIntent(notifyPIntent);

效果很好。我想说的是,如果您不希望由于用户单击您的通知而重新启动您的活动,那么这是您最好的选择。


答案 2

您似乎错过了 和 呼叫。我相信这是自动取消工作所必需的。PendingIntentsetContentIntent()

下面是此示例项目中一些有效的显示逻辑:Notification

  private void raiseNotification(Intent inbound, File output, Exception e) {
    NotificationCompat.Builder b=new NotificationCompat.Builder(this);

    b.setAutoCancel(true).setDefaults(Notification.DEFAULT_ALL)
     .setWhen(System.currentTimeMillis());

    if (e == null) {
      b.setContentTitle(getString(R.string.download_complete))
       .setContentText(getString(R.string.fun))
       .setSmallIcon(android.R.drawable.stat_sys_download_done)
       .setTicker(getString(R.string.download_complete));

      Intent outbound=new Intent(Intent.ACTION_VIEW);

      outbound.setDataAndType(Uri.fromFile(output), inbound.getType());

      b.setContentIntent(PendingIntent.getActivity(this, 0, outbound, 0));
    }
    else {
      b.setContentTitle(getString(R.string.exception))
       .setContentText(e.getMessage())
       .setSmallIcon(android.R.drawable.stat_notify_error)
       .setTicker(getString(R.string.exception));
    }

    NotificationManager mgr=
        (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

    mgr.notify(NOTIFY_ID, b.build());
  }