Aws Sdk 2.12.3 Использование TransferService - PullRequest
6 голосов
/ 14 марта 2019

Мы использовали версию 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 без объекта уведомления будет работать, когда пользователь запускает приложение. Но когда приложение не работает или не находится в памяти, запускается наша задача загрузки журнала, которая вызывает onCreate класса приложения, который, в свою очередь, вызывает startService , что вызывает сбой как startService невозможно вызвать, когда приложение находится в фоновом режиме.

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

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

TransferNetworkLossHandler.getInstance(getApplicationContext());

и для инициализации фиктивной проверки сети после инициализации мы используем

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

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

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

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

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

            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 голосов
/ 27 мая 2019
registerReceiver(TransferNetworkLossHandler.getInstance(getApplicationContext()), new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

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

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

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

...