GcmNetworkManager OneoffTask вызывается очень часто, Проблемы с обнаружением изменений состояния сети на Android N

Мне нужно, чтобы приложение просыпалось при изменении состояния сети, даже если оно не работает в фоновом режиме.

До Android N в манифесте было зарегистрировано изменение состояния сети

<receiver android:name=".receiver.NetworkStateChangeReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
    </intent-filter>
</receiver>

Это устарело для Android N. Я знаю, что все еще можно зарегистрировать это не в манифесте, а программно, но тогда оно работает, пока приложение работает в фоновом режиме. -> Но мне нужно решение, которое работает, когда приложение полностью закрыто.

То, что я попробовал сейчас, это наличие службы, расширяющей GcmTaskService который выглядит так:

public class NetworkChangeService extends GcmTaskService {

    public static String TAG = "networkChangeTask";
    private static long ONE_DAY_IN_SECONDS = 3600L * 24L;

    @Override
    public int onRunTask(TaskParams taskParams) {

        // do my task here like syncing stuff

        scheduleTask(this);
        return GcmNetworkManager.RESULT_SUCCESS;
    }

    public static void scheduleTask(Context context) {
        OneoffTask task = new OneoffTask.Builder()
                .setService(NetworkChangeService.class)
                .setTag(TAG)
                .setExecutionWindow(1L, ONE_DAY_IN_SECONDS)
                .setRequiredNetwork(Task.NETWORK_STATE_CONNECTED)
                .setPersisted(true)
                .setUpdateCurrent(true)
                .build();

        GcmNetworkManager.getInstance(context).schedule(task);
    }

    @Override
    public void onInitializeTasks() {
        super.onInitializeTasks();
        // Re-schedule periodic task on app upgrade.
        scheduleTask(this);
    }
}

Основная идея состоит в том, чтобы запланировать задачу, которая вызывает изменение сети, и если она действительно перепланирует эту задачу на случай, если состояние сети снова изменится в будущем.

Кажется, это работает на первый взгляд, onRunTask(TaskParams taskParams)вызывается каждый раз, когда сеть меняется, когда я отлаживаю это. Но когда я оставляю свой телефон Android заблокированным на моем столе на один час (и он подключен к Wi-Fi) и не перемещается или что-либо еще, задача вызывается примерно 40 раз в течение одного часа!

Может кто-нибудь объяснить мне, почему эта задача называется так часто? Действительно ли состояние сети меняется в течение одного часа или я использую OneoffTask неправильно?

Дополнительный вопрос: я обычно хочу выполнять задачу каждый раз, когда устройства переключаются из неподключенного к подключенному состоянию, я не обязан использовать GcmNetworkManager. Есть ли лучший способ добиться этого на Android (без использования толчков или каких-либо внешних услуг)?

0 ответов

Другие вопросы по тегам