Aws Sdk 2.12.3 TransferService的使用

时间:2019-03-14 07:14:02

标签: android amazon-web-services amazon-s3 aws-sdk android-8.0-oreo

我们使用Amazon SDK 2.4.2版本进行文件上传和下载。最近,我们将其更新为2.12.3。

在较早的版本中,用于在内部内部启动 TransferService 的任何上载或下载任务均在后台处理网络连接监视。

但是为了支持Android 8的有限后台服务优化,在最新版本中,SDK已停止在内部调用 TransferService ,并鼓励开发人员显式调用它。推荐该服务的一个推荐位置是应用程序类的onCreate TransferService 已被简化为只是另一个类 TransferNetworkLossHandler 的初始化程序,该类扩展了BroadcastReceiver,该类可在连接发生更改时处理下载的暂停/恢复。 在旧版本和更新版本的SDK中启动 TransferService 的主要区别在于,它是使用 startService 方法启动的。但是现在,Amazon文档建议在8.0设备及更高版本的设备上以“ startForegroundService ”开头并带有Notification对象。

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

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

我们使用以下代码绕过 TransferService 并在应用程序类的 onCreate中初始化 TransferNetworkLossHandler

TransferNetworkLossHandler.getInstance(getApplicationContext());

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

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

,以便基于网络连接,SDK可以暂停或恢复下载。

在8.0及更高版本的设备上,是否可以使用Amazon SDK上传/下载而不使用通知?

此外,任何与此类用例的最佳做法相关的链接都将受到高度赞赏。

更新:找到了一种解决方法,可以在不显示可见通知的情况下启动服务。 在启动服务时,将一个空字符串设置为传递给TransferService的通知对象的通道ID。

            Intent tsIntent = new Intent(context, TransferService.class);
            s3notificationBuilder.setChannelId("");
            tsIntent.putExtra(TransferService.INTENT_KEY_NOTIFICATION, s3notificationBuilder.build());
            tsIntent.putExtra(TransferService.INTENT_KEY_NOTIFICATION_ID, S3_SERVICE_NOTIFICATION_ID);
            tsIntent.putExtra(TransferService.INTENT_KEY_REMOVE_NOTIFICATION, true);
            context.getApplicationContext().startForegroundService(tsIntent);

仍在寻找非解决方法。

1 个答案:

答案 0 :(得分:0)

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

我将此代码放在Application类或需要侦听网络更新的活动中。

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

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