GCM Network Manager - периодическая задача не запускается
Я пытаюсь использовать GcmNetworkManager для планирования повторяющейся задачи в моем приложении, которая запускается до уровня API 17. Я настроил все, как описано на странице GCM Network Manager ( 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 секунд - это правильное предположение? Почему он вообще не стреляет?
Спасибо!
2 ответа
Проблема в том, что вы переопределяете onStartCommand! Так Google Play Services выполняет задачу на вашем GcmTaskService. Если вы хотите, чтобы это работало просто
return super.onStartCommand(intent, flags, startId);
Возможно, стоит упомянуть, что причина в onRunTask заключается в том, что вам не нужно беспокоиться о жизненном цикле вашей службы - вы можете положиться на внутренние компоненты GcmTaskService, чтобы при необходимости остановить StopService.
Тем не менее, если вы запустите на своем GcmTaskServiceService() с пользовательскими намерениями, вы, скорее всего, испортите это и в итоге получите Службу, которая не останавливается, когда это должно быть.
Если вам нужно вызвать GcmTaskService (не рекомендуется), вам следует привязать его - этот интерфейс полностью не затронут внутренними компонентами GcmTaskService.
@Override
public int onRunTask(TaskParams taskParams)
{
Log.info("onRunTask: " + taskParams.getTag());
return GcmNetworkManager.RESULT_SUCCESS;
}
@Override
public void onCreate()
{
Log.i(TAG, "in onCreate");
super.onCreate();
GcmNetworkManager.getInstance(this).schedule(createPeriodicSyncTask());
}
private PeriodicTask createPeriodicSyncTask()
{
return new PeriodicTask.Builder()
.setService(PeriodicSyncService.class)
.setPeriod(mSyncIntervalInSec)
.setFlex(mSyncIntervalInSec - 20)
.setTag(TAG)
.setPersisted(true)
.setRequiredNetwork(NETWORK_STATE_ANY)
.setUpdateCurrent(true)
.setRequiresCharging(false)
.build();
}