GCM 网络管理器 - 定期任务未触发
GCM Network Manager - Periodic Task not firing
我正在尝试使用 GcmNetworkManager 在我的应用程序中安排一个周期性任务,运行s 下降到 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 Services 在您的 GcmTaskService 上执行任务的方式。
如果你想让它简单地工作
return super.onStartCommand(intent, flags, startId);
也许值得一提的是,提供 onRunTask 的原因是您不必担心服务的生命周期 - 您可以依靠 GcmTaskService 的内部机制在需要时停止服务。
就是说,如果您使用自定义意图在 GcmTaskService 上启动服务(),您可能会把它搞砸并最终得到一个在应该停止时没有停止的服务。
如果您确实需要调用 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();
}
我正在尝试使用 GcmNetworkManager 在我的应用程序中安排一个周期性任务,运行s 下降到 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 Services 在您的 GcmTaskService 上执行任务的方式。 如果你想让它简单地工作
return super.onStartCommand(intent, flags, startId);
也许值得一提的是,提供 onRunTask 的原因是您不必担心服务的生命周期 - 您可以依靠 GcmTaskService 的内部机制在需要时停止服务。
就是说,如果您使用自定义意图在 GcmTaskService 上启动服务(),您可能会把它搞砸并最终得到一个在应该停止时没有停止的服务。
如果您确实需要调用 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();
}