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 (без использования толчков или каких-либо внешних услуг)?