Aws SDK 2.12.3 TransferService 使用

Aws Sdk 2.12.3 TransferService Usage

我们使用 Amazon SDK 2.4.2 版进行文件上传和下载。最近我们更新到 2.12.3。

在旧版本中,任何上传或下载任务都用于在后台内部启动 TransferService,处理网络连接监控等。

但为了支持Android8项限制后台服务的优化,在最新版本中,SDK已停止内部调用TransferService,鼓励开发者显式调用.一个调用该服务的推荐位置是 Application class 的 onCreateTransferService 已缩减为仅作为另一个 class TransferNetworkLossHandler 的初始化程序,它扩展了 BroadcastReceiver,后者处理 pause/resume 下载连接变化的情况。 在旧版和新版 SDK 中启动 TransferService 的一个主要区别在于,它更早地使用 startService 方法启动。但现在 Amazon 文档建议在 8.0 及更高版本的设备上使用通知对象以“startForegroundService”开头。

我们的应用程序每晚都会在后台上传调试日志,无论当时是否正在使用该应用程序。 SDK 更新后,我们必须在 Oreo 设备上 TransferService 为 运行 时强制设置通知。我们想使用 Aws SDK 上传日志,但不想显示通知,因为我们认为这会给我们的用户带来糟糕的体验。当用户启动应用程序时,仅调用 startService 而没有通知对象将起作用。但是当应用程序不在 运行 或不在内存中时,我们的上传日志任务会被触发,它会调用 Application class 的 onCreate 进而调用 startService 导致崩溃,因为当应用程序在后台时无法调用 startService

为了避免这种情况,我们尝试绕过 TransferService 的使用,并在 Application class 中自行初始化 TransferNetworkLossHandler。当应用程序正在使用或在内存中时,这似乎有效。但是如果我们刷出应用程序,后台调用时日志上传不起作用。日志也没有帮助。没有错误日志,我们正在获取正确的观察者 ID,但文件未上传到存储桶。

我们正在使用以下代码绕过 TransferService 并在 Application class 中初始化 TransferNetworkLossHandler' s onCreate。

TransferNetworkLossHandler.getInstance(getApplicationContext());

并在初始化后启动虚拟网络检查,我们使用

TransferNetworkLossHandler.getInstance(getApplicationContext()).onReceive(context, new Intent().setAction(ConnectivityManager.CONNECTIVITY_ACTION)); 

以便 SDK 可以根据网络连接暂停或恢复下载。

有什么方法可以使用 Amazon SDK upload/download 而无需在 8.0 及更高版本的设备上使用通知?

此外,非常感谢与此类用例的最佳实践相关的任何链接。

registerReceiver(TransferNetworkLossHandler.getInstance(getApplicationContext()), new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

我将此代码放入我的应用程序 class 或 activity 我需要监听网络更新。

我有一个问题,当我处于离线状态时,我的上传会挂起在 WAITING_FOR_NETWORK 状态并且永远不会恢复。现在可以正常使用了。

来源: https://github.com/aws-amplify/aws-sdk-android/issues/899