Jas*_*son 8 android android-service android-notifications intentservice
我有一个上传文件的IntentService.一切正常,但我对如何处理通知有点困惑.当我开始使用通知时,startForeground()因为文件可能相当大,除非绝对必要,否则我不希望上传被杀死.当我使用startForeground()它时,在通知区域中显示两个通知(一个在正在进行,一个在通知下):

我已经阅读了许多不同的Stack Overflow帖子和网络文章,但他们都没有回答我的问题...希望我没有错过一个谈论这个问题.
我的理解是,上图中的持续通知(没有进度条的通知)放在那里,因为它在前台运行(服务文档).如果你问我,这一切都很好,我理解为什么.但是,我不需要显示两个通知,我很确定大多数人不希望两个通知混乱通知区域.我想知道如何正确处理通知,以便只有一个显示并且不会使通知区域混乱.
我能够解决这个问题的唯一方法是,如果我将startForeground (int id, Notification notification)(ONGOING_NOTIFICATION_ID在下面的代码中)的整数ID设置为零.但是,我上面引用的文档说:
Caution: The integer ID you give to startForeground() must not be 0
将其设置为0将禁用正在进行的通知,然后只显示带有进度条的常规通知.我想我可以通过设置来"修复"这个, .setOngoing(true)直到它完成上传文件然后设置.setOngoing(false)一旦完成,所以它可以被解雇.我不确定将整数ID设置为0对于"谨慎"是多么重要.对我来说,这似乎是一种懒惰的方式来解决我遇到的问题,但我不知道知道是否有其他后果将其设置为0.此外,这只有在我只有一个我正在处理的通知时才有效.如果我有多个不同的通知,那么每个我都需要不同的ID,这不起作用.更新:看起来将ID设置为0将无法在Android 4.3中运行,所以现在我回到原点.
什么是绕过显示两个通知的有效方法?
更新/解决方案: Duh,休息一段时间然后再回到这里并根据@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
}
....
}
Run Code Online (Sandbox Code Playgroud)
首先,根据您的描述判断,您可能能够摆脱常规服务,并认识到内存不足杀手不会来调用,除非设备上的情况变得很糟糕并且您的服务确实一直在运行很长时间。
也就是说,如果您必须将服务置于前台,则这里的典型策略是使用将服务置于前台状态时使用的通知来显示进度。使用NotificationManager.notify您可以根据需要发布任意数量的更新到该通知,包括通过Notification.Builder.setProgress例如调整进度条。
通过这种方式,您只向用户显示一个通知,并且它是startForeground.