android - 在前台服务中运行网络代码后仍然收到“过度网络使用(后台)”警告
问题描述
经过几个月的调试,我们现在可以在前台服务中运行所有与网络相关的代码。
但是,我们仍然在 Android Vital 中收到“过度网络使用(后台)”警告。
执行前台服务代码时,通知 UI 将始终显示在状态栏区域。
当我们“退出”我们的应用程序时,我们会启动前台服务,使用WorkManager
. WorkManager
前台服务启动后,将立即返回。
public class SyncWorker extends Worker {
@NonNull
@Override
public Result doWork() {
final Intent intent = new Intent(WeNoteApplication.instance(), SyncForegroundIntentService.class);
ContextCompat.startForegroundService(
WeNoteApplication.instance(),
intent
);
return Result.success();
}
}
public class SyncForegroundIntentService extends IntentService {
private static final String TAG = "com.yocto.wenote.sync.SyncIntentService";
public SyncForegroundIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
final Context context = WeNoteApplication.instance();
NotificationCompat.Builder builder = new NotificationCompat.Builder(...
startForeground(SYNC_FOREGROUND_INTENT_SERVICE_ID, builder.build());
// Perform networking operation within foreground service.
stopForeground(true);
边注
我们认为我们发送的数据不多。如您所见,我们的最新版本处于最低范围(每小时 0 - 5 MB)
知道为什么我们仍然会收到“过度网络使用(后台)”吗?显然,我们不再在后台执行任何网络调用。
我们利用https://developer.android.com/reference/android/app/Service.html#startForeground(int,%20android.app.Notification)和https://developer.android.com/reference/android/content/ Context.html#startForegroundService(android.content.Intent)
解决方案
您正在使用 aWorker
来调用ForegroundService
. 从Worker
的文档中:
Worker 类在运行时由 WorkManager 实例化,并在 预先指定的后台线程上调用 doWork() 方法(请参阅 Configuration.getExecutor())。该方法用于同步处理您的工作,这意味着一旦您从该方法返回,Worker 就被认为已完成并将被销毁。(...) 如果工作因任何原因被抢占,则不会重用同一个 Worker 实例。这意味着每个 Worker 实例只调用一次 doWork()。如果需要重新运行一个工作单元,则会创建一个新的 Worker。
AForegroundService
是Service
您将其置于前台状态,这意味着如果进程需要 CPU 或您的应用程序已关闭,系统将不会终止该进程。这个也只有那个。我找不到证明这一点的 Android Vital 的文档,所以这只是我的怀疑,但我很肯定情况就是这样:这意味着无论您使用ForegroundService
与否,Android Vital 仍然很重要这是作为背景工作。
将应用程序的移动网络使用移至前台的正确方法是DownloadManager
使用适当的可见性设置集进行调用(如您提供的链接中所述)。请让我知道这是否有帮助 - 如果没有,我们会尝试不同的方法。顺便说一句,您能否将统计信息缩小到特定的 API 版本?(在 9.0 和 8.0 中有一些后台线程更改,所以这也可以作为一个线索)
推荐阅读
- ios - 如何使扩展中的按钮将用户重定向到某个页面
- mysql - 有人能解释一下这个查询中的 w1 和 w2 和 4 是什么意思吗
- r - RMarkdown - 使用 DT 创建列标题
- javascript - 将来自 html 网页的多个输入的数据保存为 .txt(本地)并将它们加载回相同的位置
- node.js - 特快专递数组未定义?
- azure-pipelines - 在 Azure Pipeline 中查找项目构建服务的名称
- visual-studio-code - 在 vscode 上使用内置设置同步时,实际文件在哪里?
- distance - 在 GeoPandas 中获取两点之间的距离
- c# - 如何使用 LocalDB 和 SQL 连接为我的 Visual Basic WinForms 应用程序创建安装程序/设置项目?
- python - 设置 Django 日期字段时出现错误