6

我正在尝试使用 GcmNetworkManager 在我的应用程序中安排重复任务,该任务运行到 API 级别 17。我已经按照 GCM 网络管理器页面(https://developers.google.com/云消息/网络管理器):

在我的 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 秒运行一次 - 这是一个正确的假设吗?为什么根本不发火?

谢谢!

4

2 回答 2

9

问题是您正在覆盖 onStartCommand!这就是 Google Play Services 在 GcmTaskService 上执行任务的方式。如果你想让它简单地工作

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

也许值得一提的是,提供 onRunTask 的原因是您不必担心 Service 的生命周期——您可以在需要时依靠 GcmTaskService 的内部来停止服务。

也就是说,如果您在 GcmTaskService 上使用自定义意图 startService(),您可能会搞砸并最终得到一个在应该停止的时候没有停止的服务。

如果您确实需要调用 GcmTaskService(不推荐),您应该绑定到它 - 该接口完全不受 GcmTaskService 内部的影响。

于 2015-07-14T17:45:52.723 回答
1
@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();
}
于 2015-08-31T17:13:31.640 回答