Использование Aws Sdk 2.12.3 TransferService

#android #amazon-web-services #amazon-s3 #aws-sdk #android-8.0-oreo

#Android #amazon-веб-сервисы #amazon-s3 #aws-sdk #android-8.0-oreo

Вопрос:

Мы использовали версию 2.4.2 Amazon SDK для загрузки файлов. Недавно мы обновили его до версии 2.12.3.

В более старых версиях любая задача загрузки использовалась для внутреннего запуска TransferService в фоновом режиме, которая, помимо прочего, выполняла мониторинг сетевого подключения.

Но для поддержки оптимизации Android 8 по ограничению фоновых служб в последней версии SDK прекратил внутренний вызов TransferService и рекомендует разработчику вызывать его явно. Одним из рекомендуемых мест для вызова службы является класс приложения onCreate. TransferService был сокращен до простого инициализатора для другого класса TransferNetworkLossHandler, который расширяет BroadcastReceiver, который обрабатывает приостановку / возобновление загрузок в случае изменения подключения. Одним из основных отличий запуска TransferService в более старых и новых SDK является то, что ранее он запускался с использованием метода startService. Но теперь документы Amazon рекомендуют начинать с «startForegroundService» с объекта уведомления на устройстве версии 8.0 и выше.

Наше приложение загружает журналы отладки каждую ночь в фоновом режиме, независимо от того, используется приложение в это время или нет. После обновления SDK мы в обязательном порядке должны настроить уведомление во время работы TransferService на устройствах Oreo. Мы хотим использовать Aws SDK для загрузки журналов, но не хотим показывать уведомление, поскольку считаем, что это приведет к ухудшению работы наших пользователей. Вызов просто startService без объекта уведомления будет работать, когда приложение запускается пользователем. Но когда приложение не запущено или не в памяти, наш журнал загрузок триггера, который вызывает класс применения-это метод который в свою очередь вызывает startService что вызывает крах, как startService не может быть вызван, когда приложение находится в фоновом режиме.

Чтобы избежать этого, мы попытались обойти использование TransferService и самостоятельно инициализировать TransferNetworkLossHandler в классе приложения. Похоже, это работает, когда приложение используется или находится в памяти. Но если мы проведем пальцем по приложению, загрузка журнала не будет работать при вызове в фоновом режиме. Журналы также не помогают. Журналов ошибок нет, и мы получаем правильные идентификаторы наблюдателя, но файлы не загружаются в корзину.

Мы используем следующий код для обхода TransferService и инициализации TransferNetworkLossHandler в классе приложения onCreate.

 TransferNetworkLossHandler.getInstance(getApplicationContext());
  

и чтобы инициировать фиктивную проверку сети после инициализации, мы используем

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

таким образом, в зависимости от сетевого подключения загрузка может быть приостановлена или возобновлена с помощью SDK.

Есть ли какой-либо способ использовать Amazon SDK для загрузки без использования уведомлений на устройствах версии 8.0 и выше?.

Кроме того, мы высоко ценим любые ссылки, связанные с лучшими практиками для таких случаев использования.

Ответ №1:

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

Я помещаю этот код в свой класс приложения или в действие, которое мне нужно для прослушивания сетевых обновлений.

У меня была проблема, из-за которой, когда я был отключен, мои загрузки зависали в состоянии WAITING_FOR_NETWORK и никогда не возобновлялись. Теперь все работает нормально.

Источник: https://github.com/aws-amplify/aws-sdk-android/issues/899