9

在过去的几天里,我的应用程序中的 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/NotificationManager(28356):通知:id 损坏:发送 1,返回 0

我尝试使用与 1 不同的数字,但没有帮助。我不知道该怎么做。我使用的代码来自这里的服务和通知Android 文档。当我将代码隔离在单独的干净应用程序中时,该应用程序的设置方式与我正在处理的通知类似。以前有没有人遇到过这个问题或有任何想法?

任何帮助表示赞赏。谢谢!

4

7 回答 7

13

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

  1. 转到设置 > 应用程序(应用程序管理器)。
  2. 点按您要停止的应用程序。
  3. 点击以取消选中显示通知框。

仅供参考,它可能因一个 android 设备而异,但它们或多或少是相同的。

于 2013-02-09T22:02:54.593 回答
5

从 API 25 (Nougat) 开始,Android 设置了速率限制以阻止应用程序对通知栏进行 DDOS。可以在此处查看引入此更改的对 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));

您可以在我的博客上阅读有关此问题的更多信息

于 2017-08-16T08:47:11.470 回答
1

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

于 2012-12-02T20:07:55.033 回答
1

当您多次安装并重新安装应用程序时

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

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

于 2015-08-25T13:37:48.943 回答
0

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

 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);
 }
于 2018-08-14T13:09:50.947 回答
-1

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

于 2012-12-01T01:19:40.847 回答
-1

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

于 2013-01-08T22:45:28.843 回答