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

谢谢!

最佳答案

问题是您要重写onStartCommand!这就是Google Play服务在GcmTaskService上执行任务的方式。
如果您希望它简单地工作

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

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

就是说,如果您使用自定义的 Intent 在GcmTaskService上启动startService(),则很可能将其弄乱,并最终导致服务在应有的状态下没有停止。

如果确实需要调用GcmTaskService(不建议使用),则应绑定(bind)到它-该接口(interface)完全不受GcmTaskService内部的影响。

09-05 08:57