Android NotificationManager无法显示带有“的通知”;通知:id已损坏:已发送1,已返回0“;警告

Android NotificationManager无法显示带有“的通知”;通知:id已损坏:已发送1,已返回0“;警告,android,Android,在过去的几天里,我在我的应用程序中遇到了NotificationManager问题,我似乎还没有接近解决它 我有一个非常简单的服务,目前什么都不做。它只应显示通知: public class UpdateService extends Service { private static final String TAG = "UpdateService"; private static int NOTIFICATION_ID = 1; private UpdateService

在过去的几天里,我在我的应用程序中遇到了NotificationManager问题,我似乎还没有接近解决它

我有一个非常简单的服务,目前什么都不做。它只应显示通知:

public class UpdateService extends Service {
private static final String TAG = "UpdateService";
private static int NOTIFICATION_ID = 1;
private UpdateServiceBinder binder = new UpdateServiceBinder();

@Override
public void onCreate() {
        Log.i(TAG, "Service created");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "Service started");
    
    sendNotification(100);
    
    return Service.START_NOT_STICKY;
}

private void sendNotification(int updatedItems) {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext())
            .setSmallIcon(R.drawable.icon)
            .setContentTitle("Sync")
            .setContentText("Updated " + updatedItems);
    
    Intent resultIntent = new Intent(getBaseContext(), MainActivity.class);
    
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(getApplicationContext());
    stackBuilder.addParentStack(MainActivity.class);
    stackBuilder.addNextIntent(resultIntent);

    PendingIntent resultPendindIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    
    builder.setContentIntent(resultPendindIntent);
    
    NotificationManager manager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
    manager.notify(NOTIFICATION_ID, builder.build());
}
    
@Override
public IBinder onBind(Intent intent) {
    return binder;
}

@Override
public boolean onUnbind(Intent intent) {
    return true;
}

public class UpdateServiceBinder extends Binder {
    public UpdateService getService() {
        return UpdateService.this;
    }
}
}

不幸的是,当服务启动并且应该显示通知时,什么也没有发生。服务肯定是根据日志消息启动的。同时,NotificationManager发出警告:

11-30 23:24:34.620:I/UpdateService(28356):已创建服务

11-30 23:24:34.800:I/UpdateService(28356):服务已启动

11-30 23:24:34.808:W/通知经理(28356):通知:id 已损坏:已发送1,已返回0

我试着用不同于1的数字,但没用。我不知道该从中得到什么。我使用的代码来自中的服务和中的通知的Android文档。当我在单独的clean应用程序中隔离代码时,通知会正确显示,该应用程序的设置方式与我正在处理的应用程序类似。以前有没有人遇到过这个问题或者有什么想法

谢谢你的帮助。
谢谢

我不知道为什么要使用getBaseContext(),但我建议您改用getApplicationContext()。另外,我不知道为什么要绑定到该服务

我找到了解决这个问题的办法。我不得不将包名从com.gttn.sample更改为com.gttn.sample2。我不太清楚为什么我必须这么做,但通知显示正确,警告消失了。

我自己只是研究了这个问题。如果日志文件中没有其他行(应该在之后的5行以内),则可能会出现类似于“E/NotificationService(287):按用户请求禁止来自包的通知”的消息。这是ICS(可能是JB)中的一个新设置,用于禁用每个应用程序的通知。转到设置-->应用-->并单击顶部附近的复选框“显示通知”。出于显而易见的原因,更改包名将非常有效地绕过此设置。

我遇到了此问题,然后我记得我已从“应用程序信息”中禁用了“显示通知”。我启用了它,通知又回来了

  • 转到设置>应用程序(应用程序管理器)
  • 轻触要停止的应用程序
  • 点击以取消选中显示通知框

  • 仅供参考,不同的安卓设备可能会有所不同,但它们或多或少都是一样的。

    当你多次安装和重新安装应用程序时

    取消选中“设置”>“应用程序管理器”>“您的应用程序”中的“显示通知”

    只需再次检查“显示通知”,并感到高兴

    从API 25(Nougat)开始,Android设置了速率限制,阻止应用程序使用通知阴影。对引入此更改的AOSP的提交可以是

    我之所以看到这些日志,是因为我试图更新循环中的进度通知:

    Observable.range(0, 100)
      .subscribe(progress -> updateProgressNotification(progress));
    
    在每次发射之间增加200毫秒的延迟可以解决我的问题:

    Observable.range(0, 100)
      .zipWith(Observable.interval(200, TimeUnit.MILLISECONDS), (progress, delay) -> progress)
      .subscribe(progress -> updateProgressNotification(progress));
    

    您可以。

    我已经编写了代码,可以下载歌曲并将下载进度更新为通知中的进度。如果你在代码第6行看到,如果该条件被删除,则当while循环读取输入流中的字节时,通知会很快更新。现在这会导致通知重复更新,这被认为是从noughat verions开始的问题,它保持了通知更新的速率限制。希望您对此有所了解

     int previousPercentage = 0;
     int currentPercentage = 0;
     while ((bytesRead = inputStream.read(bytes)) != -1) {
           totalbytes = totalbytes + bytesRead;
           currentPercentage = (totalbytes * 100) / length_of_file;
           if (previousPercentage != currentPercentage) {// line : 6
            updateProgressNotification(builder, notificationId, currentPercentage);
           }
           previousPercentage = currentPercentage;
           fileOutputStream.write(bytes, 0, bytesRead);
     }
    

    你是对的,我应该使用getApplicationContext()。事实上,代码的第一个版本使用了它。我忘了恢复对代码所做的更改。它不适用于引发完全相同的警告的getApplicationContext(),并且不会显示通知。另外,我现在没有从任何地方绑定到服务,因为我想先试用通知。将来我将绑定到该服务以便与之通信。谢谢你的回复。我只是花了几个小时试图解决这个问题,所以有人建议查看logcat,即使我的代码中没有生成错误。事实证明,“显示通知”是问题所在。真正让我恼火的是,即使在卸载并重新安装应用程序之后,“显示通知”仍然被禁用。WTF谷歌?刚刚碰到这个。确认如果您试图在短时间内显示太多通知,则会发生这种情况。在本例中,代码中有一个bug,导致两个intentservice相互调用(每个intentservice负责显示通知)。