4

と GCM を使用しSyncAdapterて、バックエンド サーバーでのさまざまな種類の変更をアプリに通知しています。たとえば、変更 A がサーバーで発生した場合、 change_a というフィールドを使用してプッシュ通知を行い、これを through に渡しSyncAdapterますContentResolver.requestSync()。このようにしSyncAdapterて、 はサーバーから何を同期するかを認識します。同様に、変更 B の場合、change_b というフィールドを送信します。

これは、1 つのユース ケースを除いて完全に機能します。change_a 通知を送信すると呼び出しますContentResolver.requestSync()が、ネットワークが利用できないため、SyncAdapterまだ呼び出されていません。その後、change_b 通知を送信するContentResolver.requestSync()と、新しいフィールドで再度呼び出されます。そして、ネットワークが起動すると、SyncAdapterが呼び出されますが、最新のフィールド change_b のみを使用するため、変更 A は同期されません。

したがって、基本的に、まだ SyncAdapter をトリガーしていないContentResolver.requestSync()以前のすべての呼び出しをオーバーライドします。requestSync()SyncAdapter は、送信された最新のエクストラで実行されます。

これに対する 1 つの解決策は、変更 A と変更 B を区別せず、SyncAdapterすべてを同期させることです。しかし、これは帯域幅にとってコストがかかります。何をいつ同期するかを制御したい。これを修正するためにできることはありますか (おそらく syncadapter フラグ)?

4

2 に答える 2

3

間違った結論を導き出したようです。実際には、いくつかのさらなるテストの後、requestSync()異なるエクストラで呼び出された場合SyncAdapter、異なるバンドルごとに数回呼び出されます。

私の問題は別の場所にありました。プッシュ通知を受信するときは、アラームをスケジュールして同期要求をトリガーしPendingIntent、 をフラグとともに使用しますPendingIntent.FLAG_CANCEL_CURRENT。つまり、アラームが鳴る前に別のプッシュ通知が来た場合、アラームは新しいデータで上書きされます。 . そのため、デバイスがオフラインの場合、オンラインになったときに、保留中のすべてのプッシュ通知を受信し、最新のプッシュ通知からのデータで設定されたアラームが 1 つだけになります。

私がこの問題を解決した方法は、各 PendingIntent に異なるアクションを設定して、同じタイプの新しいアラームを設定しても他のタイプのアラームが上書きされないようにすることです。

これを改善するには、同期の種類ごとに collapse_key を追加して、各種類のプッシュ通知の 1 つだけがデバイスに配信されるようにします。

于 2012-11-11T09:40:46.043 に答える
1

間違った結論を導き出したようです。実際には、さらにテストした後、requestSync() が異なるエクストラで呼び出された場合、異なるバンドルごとに SyncAdapter が数回呼び出されます。

への複数回の呼び出しで異なるエクストラを使用する場合requestSync()performSync()各 に対して呼び出されますrequestSync()。証明を追加したい: SyncOperation.javatoKey()内の呼び出しは、extras バンドル内からの値を組み込みます。これにより、これらの重複排除が防止されます。SyncManagerSyncOperations

于 2013-10-30T21:41:22.907 に答える