Использование JobScheduler вместо BroadcastReceiver и Service

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

Для этого я написал BroadcastReceiver, который будет прослушивать сетевое соединение. Когда этот приемник срабатывает, я запускаю фоновую службу для загрузки записей.

Вот мой код.

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {
       AppUtils.checkInternetConnection(context));
        //If the device has the internet connection and if there are any pending records to upload to server then start the service for uploading the records.
        if (AppUtils.checkInternetConnection(context)) {
            if (Database.getInstance().getTotalRecordsCount() > 0) {
                context.startService(new Intent(context, SurveyUploadService.class));
            }
        } else {
            context.stopService(new Intent(context, SurveyUploadService.class));
        }
    }
}

Теперь мое сомнение

<сильный>1. Могу ли я сделать то же самое с помощью JobScheduler?< бр> <сильный>2. Какой подход лучше (мой или тот, который использует JobScheduler) и почему?


person Kartheek    schedule 13.10.2016    source источник
comment
Пробовали ли вы внедрить службу занятости?   -  person Yvonne Marggraf    schedule 02.10.2018


Ответы (1)


Я не знаю, какое действие вы используете для BroadcastReceiver, но я предполагаю, что это действие CONNECTIVITY_CHANGE. Если вы используете его, прочитайте следующий текст со стороны о поведении Android 7.0. Изменения:

Чтобы решить эти проблемы, в Android 7.0 применяются следующие оптимизации:

  • Приложения, предназначенные для Android 7.0, не получают широковещательные сообщения CONNECTIVITY_ACTION, даже если у них есть записи манифеста для запроса уведомления об этих событиях. Запущенные приложения могут по-прежнему прослушивать CONNECTIVITY_CHANGE в своем основном потоке, если они запрашивают уведомление с помощью BroadcastReceiver.

  • Приложения не могут отправлять или получать трансляции ACTION_NEW_PICTURE или ACTION_NEW_VIDEO. Эта оптимизация влияет на все приложения, а не только на Android 7.0.

Если ваше приложение использует какое-либо из этих намерений, вам следует как можно скорее удалить зависимости от них, чтобы правильно настроить таргетинг на устройства Android 7.0. Платформа Android предоставляет несколько решений для уменьшения потребности в этих неявных широковещательных рассылках. Например, API JobScheduler предоставляет надежный механизм планирования сетевых операций при выполнении определенных условий, таких как подключение к сети без лимита. Вы даже можете использовать JobScheduler, чтобы реагировать на изменения поставщиков контента.

Поэтому лучше использовать API JobScheduler.

Вот пример JobScheduler.

person Chris    schedule 13.10.2016
comment
в чем разница между CONNECTIVITY_CHANGE и CONNECTIVITY_ACTION? - person Kartheek; 14.10.2016
comment
Если вы посмотрите здесь developer.android.com/reference/android/net/ вы увидите, что CONNECTIVITY_ACTION — это имя константы со значением android.net.conn.CONNECTIVITY_CHANGE'. - person Chris; 14.10.2016
comment
Это здорово, спасибо - person Kartheek; 17.10.2016
comment
Означает ли это, что проверку CONNECTIVITY_CHANGE невозможно выполнить в фоновом режиме из цели ›= N ? - person Rafael Ruiz Muñoz; 08.08.2017
comment
Да, если вы используете неявный широковещательный приемник, т.е. как часть манифеста. Рекомендуется планировщик заданий. - person siva; 28.09.2017