我有一个IntentService用于上传文件。一切工作正常,但是我对如何处理通知有点困惑。当我启动通知时,我使用
据我所知,上图中的持续通知(没有进度条的那个)是因为它在前台运行而被放置在那里(服务文档)。如果你问我,这很好,我也理解为什么。然而,我不需要显示两个通知,我相信大多数人也不想在通知区域里看到两个通知。我想知道如何正确处理通知,以便只显示一个并且不会混乱通知区域。
我唯一能够解决这个问题的方法是将
startForeground()
,因为文件可能相当大,除非绝对必要,否则不希望上传被杀死。当我使用startForeground()
时,它在通知区域显示两个通知(一个在进行中,另一个在通知下):
据我所知,上图中的持续通知(没有进度条的那个)是因为它在前台运行而被放置在那里(服务文档)。如果你问我,这很好,我也理解为什么。然而,我不需要显示两个通知,我相信大多数人也不想在通知区域里看到两个通知。我想知道如何正确处理通知,以便只显示一个并且不会混乱通知区域。
我唯一能够解决这个问题的方法是将
startForeground (int id, Notification notification)
中的整数ID(在我的代码中为ONGOING_NOTIFICATION_ID
)设置为零。然而,我引用的上面的文档说:
注意:您给startForeground()的整数ID不能为0
将它设置为0将会禁用持续的通知,进度条只会显示在常规通知中。我认为我可以通过将 `setOngoing(true)` 设置为正在上传文件直到上传完成时将 `setOngoing(false)` 设置为可解除,以此来“修复”这个问题。我不确定将整数 ID 设置为0需要多么“小心谨慎”。对我来说,它似乎是解决我的问题的一种懒惰方式,但我不知道将其设置为0是否会有其他后果。而且,这仅适用于处理一个通知的情况。如果我有多个不同的通知,则需要为每个通知使用不同的ID,这样做就不起作用了。更新: 看起来 将ID设置为0在Android 4.3中行不通,所以现在我又回到了原点。
如何更好地避免同时显示这两个通知?
更新/解决方案:嗯,休息一段时间后回来,根据@dsandler的建议仔细检查我所做的事情帮助我找出了我做错了什么。当我进行进度更新时,我没有设置正确的ID,这就是为什么它创建了两个通知而且一个没有得到更新的原因。对于所有通知使用相同的ID(ONGOING_NOTIFICATION_ID)解决了我的问题。请参见以下代码以获取我之前未包括的其他部分和我犯的错误。来自UploadFile.java的相关代码:
public class UploadFile extends IntentService {
private static final int ONGOING_NOTIFICATION_ID = 1;
@Override
protected void onHandleIntent(Intent intent) {
mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mBuilder = new NotificationCompat.Builder(this);
mBuilder.setContentTitle(getText(R.string.upload))
.setContentText("0% " + getText(R.string.upload_in_progress))
.setSmallIcon(android.R.drawable.stat_sys_upload);
startForeground(ONGOING_NOTIFICATION_ID, mBuilder.build());
....
if (progress > 0){
percent = (Long.valueOf(progress) * 100) / totalSize;
mBuilder.setProgress(100, percent.intValue(), false);
mBuilder.setContentText(percent.intValue() + "% " + getText(R.string.upload_in_progress));
mNotifyManager.notify(ONGOING_NOTIFICATION_ID, mBuilder.build()); // <-- My problem was that I had set the ID here to 0 and did not make it the same as the ID I set above
}
....
}
startForegroundService()
已经显示了通知。 - IgorGanapolsky