GCM Network Manager - периодическая задача не запускается

Я пытаюсь использовать GcmNetworkManager для планирования повторяющейся задачи в моем приложении, которое работает до уровня API 17. Я настроил все, как описано на странице сетевого менеджера GCM (https://developers.google.com/cloud-messaging/network-manager):

В моем AndroidManifest.xml у меня есть:

<service
    android:name=".services.MyService"
    android:exported="true"
    android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
    <intent-filter>
        <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/>
    </intent-filter>
</service>

В моем приложении у меня есть:

long periodSecs = 30L; // the task should be executed every 30 seconds
long flexSecs = 15L; // the task can run as early as -15 seconds from the scheduled time

String tag = "myScan|1";

PeriodicTask periodic = new PeriodicTask.Builder()
        .setService(MyService.class)
        .setPeriod(periodSecs)
        .setFlex(flexSecs)
        .setTag(tag)
        .setPersisted(false)
        .setRequiredNetwork(com.google.android.gms.gcm.Task.NETWORK_STATE_ANY)
        .setRequiresCharging(false)
        .setUpdateCurrent(true)
        .build();

GcmNetworkManager.getInstance(this).schedule(periodic);

И у меня есть MyService, который выглядит так:

public class MyService extends GcmTaskService {
    @Override
    public int onRunTask(TaskParams taskParams) {
        Log.info("onRunTask: " + taskParams.getTag());

        return GcmNetworkManager.RESULT_SUCCESS;
    }

    @Override
    public int onStartCommand (Intent intent, int flags, int startId) {
        Log.info("onStartCommand");

        return GcmTaskService.START_STICKY_COMPATIBILITY;
    }
}

Когда я запускаю приложение, onStartCommand регистрируется, как и ожидалось, но onRunTask никогда не вызывается. Я что-то упускаю? Я ожидаю, что после запуска (о чем свидетельствует срабатывание команды запуска) он должен запускаться каждые 15-30 секунд - это правильное предположение? Почему вообще не стреляет?

Спасибо!


person jkane001    schedule 14.07.2015    source источник
comment
Я не могу понять, почему это long periodSecs = 30L; секунды. Я бы ожидал, что это будет в миллисекундах. Это точно секунды?   -  person lxknvlk    schedule 06.01.2017


Ответы (1)


Проблема в том, что вы переопределяете onStartCommand! Вот как службы Google Play выполняют задачу в вашем GcmTaskService. Если вы хотите, чтобы он работал просто

return super.onStartCommand(intent, flags, startId);

Возможно, стоит упомянуть, что причина, по которой предоставляется onRunTask, заключается в том, что вам не нужно беспокоиться о жизненном цикле вашей службы — вы можете положиться на внутреннюю часть GcmTaskService для остановки службы, когда это необходимо.

Тем не менее, если вы запуститеService() в своем GcmTaskService с пользовательскими намерениями, вы, вероятно, испортите это и в конечном итоге получите службу, которая не останавливается, когда это должно быть.

Если вам нужно вызвать GcmTaskService (не рекомендуется), вы должны привязаться к нему — этот интерфейс полностью не затрагивается внутренними компонентами GcmTaskService.

person 43matthew    schedule 14.07.2015
comment
О, чувак, это был огромный провал с моей стороны - конечно, это моя проблема! Спасибо - как только я подтвержу сегодня вечером, я приму ваш ответ. - person jkane001; 14.07.2015
comment
Вероятно, наименее удивительная новость дня - вы были правы! Кстати, я не планировал обрабатывать startService(), но я переопределял его только для того, чтобы зарегистрировать, что это происходит, что, по иронии судьбы, привело к сбою. Спасибо за быструю помощь! - person jkane001; 15.07.2015