我遇到的这个问题可能仅在运行Oreo或更高版本的设备上出现,因为我只有OnePlus 3T用于开发。
我有一个使用Service
开始的前景 ContextCompat#startForegroundService()
,并且在服务的startCommand
方法中,我确保创建/启用我的通知频道,以便我可以通过相关的持续通知致电startForeground
。
因此,我相信,按照要求,我可以在这里得到一切。
我的Foreground Service
会做什么:
我的问题在于最后一点。当我连接并要求发送数据时,电话上发生了两件事:
每个操作都有其自己的通知,以向最终用户显示进度。
虽然第一个操作没有延迟,但是第二个操作可能要花几分钟(在我的一项测试中最多需要6分钟)。
经过进一步测试,原因是通知,因为我取消了第一个操作通知,然后调用了第二个操作,第二个操作又将显示并更新其自己的通知。
最后,由于我在调用第二个操作之前立即在第一个操作通知上调用NotificationManagerCompat.cancel
,因此该调用可能会延迟很多时间。如果我没有先取消通知,那么第二个操作将立即开始。
作为一种解决方案,我认为打ze模式是造成此问题的原因,因此我将手机的电池优化设置手动列入了我的应用白名单。那并没有改变任何事情。
最后,如果我在任何时候都解锁了手机/打开了屏幕,则阻止/延迟通知会立即解锁,第二个过程就从蝙蝠上开始。因此,即使在屏幕关闭的情况下,将手机插入计算机时,也不会发生这种情况。
这是一个错误吗?这和打ze睡模式有关吗?我不知道。
为更清楚起见,这是代表操作顺序的代码段:
loadData() {
... // defer heavy work on a worker thread and updates notification of progress from time to time (every 10%)
notifyDataLoadingStarted(); // on main thread. Displays its notification with progress bar
}
// once the data is fully loaded
onDataLoaded() { // called on the main thread
cancelDataLoadNotification(); // asks the notification manager compat to cancel notification
initiateDataSendingOperation(); // will also defer heavy work on a worker thread and update its notification accordingly
}
发生的事情是,一旦完成第一项操作,就会调用onDataLoaded
。但是问题是cancelDataLoadNotification
正在阻止。我在主线程上,该方法最近非常返回。因此,这就是initiateDataSendingOperation
被大大延迟的原因。
当我解锁手机时,可以看到加载操作的通知卡在中间,好像加载操作已停止,大约50%。但是,这只持续了不到一秒钟,因为在我不知不觉中,第一个通知弹出了,而第二个通知弹出了。所有这些都在眨眼之间。显然,这意味着是的,第一次操作的确已经很久了,但是它的通知绝对过时了。并且由于第二操作仅在取消第一通知时才启动,因此您可以清楚地了解到第二操作被大大延迟了。
这就是为什么如果在取消第一个操作通知之前先启动第二个操作,则第一个解决方法起作用的原因。
无论如何,在屏幕关闭的情况下,通知仍然是过时的。