Google建议在收到GCM推送通知时推迟执行syncAdapter:
注意:如果您使用GCM通过广播来触发同步适配器 安装应用程序的所有设备,请记住他们收到的 你的消息大致在同一时间。这种情况可能会导致 同步适配器的多个实例同时运行, 导致服务器和网络过载。为了避免这种情况 广播到所有设备,你应该考虑推迟开始 同步适配器,用于每个设备唯一的时间段。 (source)
但是,我找不到使用延迟参数(API)发出SyncRequest的方法。我能想到的另一个(非常hacky)替代方案是启动服务(必须保持唤醒锁定,因为它是推送通知的广播接收器),它会休息几秒钟,发出SyncRequest,并释放唤醒锁定。有更好的想法吗?
答案 0 :(得分:2)
您可以简单地使用处理程序。
static final long c_delayMax = 120 * 1000;
static Random r = new Random();
public static void delayedNotification(Bundle data) {
Handler h = new Handler();
long delay = r.nextLong() % c_delayMax;
h.postDelayed(new Runnable() {
@Override
public void run() { makeSyncRequest(data); }
}, delay);
}