【发布时间】:2019-08-05 00:18:17
【问题描述】:
我们使用 2.4.2 版的 Amazon SDK 进行文件上传和下载。最近我们将其更新为 2.12.3。
在旧版本中,任何上传或下载任务都用于在后台内部启动 TransferService,用于处理网络连接监控等。
但是为了支持Android 8对限制后台服务的优化,在最新版本中,SDK内部已经停止调用TransferService,鼓励开发者显式调用。调用服务的一个推荐位置是Application 类的 onCreate。 TransferService 已简化为仅作为另一个类 TransferNetworkLossHandler 的初始化程序,该类扩展了 BroadcastReceiver,后者在连接更改的情况下处理暂停/恢复下载。 在较旧和较新的 SDK 中启动 TransferService 的一个主要区别在于,较早时它是使用 startService 方法启动的。但现在亚马逊文档建议在 8.0 及更高版本的设备上使用 Notification 对象以“startForegroundService”开头。
我们的应用每晚都会在后台上传调试日志,无论当时是否正在使用该应用。 SDK 更新后,我们必须在 TransferService 在 Oreo 设备上运行时设置通知。我们想使用 Aws SDK 上传日志,但不想显示通知,因为我们认为这会给我们的用户带来不好的体验。当用户启动应用程序时,仅调用 startService 而没有通知对象将起作用。但是当应用程序没有运行或不在内存中时,我们的上传日志任务会被触发,它调用 Application 类的 onCreate 进而调用 startService 导致崩溃为 应用在后台时无法调用 startService。
为了避免这种情况,我们尝试绕过 TransferService 的使用并在 Application 类中自行初始化 TransferNetworkLossHandler。当应用程序正在使用或在内存中时,这似乎有效。但是如果我们刷出应用程序,在后台调用时日志上传不起作用。日志也没有帮助。没有错误日志,我们获得了正确的观察者 ID,但文件没有上传到存储桶。
我们正在使用以下代码绕过TransferService,并在Application 类的 onCreate 中初始化TransferNetworkLossHandler。
TransferNetworkLossHandler.getInstance(getApplicationContext());
并在初始化后启动虚拟网络检查,我们使用
TransferNetworkLossHandler.getInstance(getApplicationContext()).onReceive(context, new Intent().setAction(ConnectivityManager.CONNECTIVITY_ACTION));
因此,SDK 可以根据网络连接暂停或恢复下载。
在 8.0 及以上的设备上,有什么方法可以在不使用通知的情况下使用 Amazon SDK 上传/下载?
此外,非常感谢与此类用例的最佳实践相关的任何链接。
【问题讨论】:
标签: android amazon-web-services amazon-s3 aws-sdk android-8.0-oreo