Android:关闭屏幕-通知延迟/被阻止

时间:2018-09-25 08:02:19

标签: java android notifications android-8.0-oreo foreground-service

我遇到的这个问题可能仅在运行Oreo或更高版本的设备上出现,因为我只有OnePlus 3T用于开发。

我有一个使用Service开始的前景 ContextCompat#startForegroundService(),并且在服务的startCommand方法中,我确保创建/启用我的通知频道,以便我可以通过相关的持续通知致电startForeground。 因此,我相信,按照要求,我可以在这里得到一切。

我的Foreground Service会做什么:

  • 它用作蓝牙服务器,使用蓝牙类RFCOMM BSPP监听客户端连接;
  • 当客户端连接时,它会监听传入的请求;
  • 它执行请求并相应地发送数据。

我的问题在于最后一点。当我连接并要求发送数据时,电话上发生了两件事:

  1. 正在从手机中加载相关数据,并且
  2. 完全加载后,数据将发送到客户端。

每个操作都有其自己的通知,以向最终用户显示进度。

虽然第一个操作没有延迟,但是第二个操作可能要花几分钟(在我的一项测试中最多需要6分钟)。

经过进一步测试,原因是通知,因为我取消了第一个操作通知,然后调用了第二个操作,第二个操作又将显示并更新其自己的通知。

最后,由于我在调用第二个操作之前立即在第一个操作通知上调用NotificationManagerCompat.cancel,因此该调用可能会延迟很多时间。如果我没有先取消通知,那么第二个操作将立即开始。

作为一种解决方案,我认为打ze模式是造成此问题的原因,因此我将手机的电池优化设置手动列入了我的应用白名单。那并没有改变任何事情。

最后,如果我在任何时候都解锁了手机/打开了屏幕,则阻止/延迟通知会立即解锁,第二个过程就从蝙蝠上开始。因此,即使在屏幕关闭的情况下,将手机插入计算机时,也不会发生这种情况。

这是一个错误吗?这和打ze睡模式有关吗?我不知道。

[编辑1]

为更清楚起见,这是代表操作顺序的代码段:

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%。但是,这只持续了不到一秒钟,因为在我不知不觉中,第一个通知弹出了,而第二个通知弹出了。所有这些都在眨眼之间。显然,这意味着是的,第一次操作的确已经很久了,但是它的通知绝对过时了。并且由于第二操作仅在取消第一通知时才启动,因此您可以清楚地了解到第二操作被大大延迟了。

这就是为什么如果在取消第一个操作通知之前先启动第二个操作,则第一个解决方法起作用的原因。

无论如何,在屏幕关闭的情况下,通知仍然是过时的。

0 个答案:

没有答案