AWS Sdk 2.12.3 TransferService的用法

use*_*660 6 android amazon-s3 amazon-web-services aws-sdk android-8.0-oreo

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

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

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

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

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

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

TransferNetworkLossHandler.getInstance(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)

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

TransferNetworkLossHandler.getInstance(getApplicationContext()).onReceive(context, new Intent().setAction(ConnectivityManager.CONNECTIVITY_ACTION)); 
Run Code Online (Sandbox Code Playgroud)

因此,基于网络连接,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);
Run Code Online (Sandbox Code Playgroud)

仍在寻找非解决方法。

Raf*_*lva 2

registerReceiver(TransferNetworkLossHandler.getInstance(getApplicationContext()), new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
Run Code Online (Sandbox Code Playgroud)

我将此代码放入我的应用程序类或我需要侦听网络更新的活动中。

我遇到一个问题,当我离线时,我的上传会挂在 WAITING_FOR_NETWORK 状态并且永远不会恢复。现在效果很好。

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