4

インターネット ディスカッション ボード用の Android クライアントを作成しています。このアプリは、サーバーからディスカッションをダウンロードし、ネイティブの Android UI を使用して表示します。コンテンツの取得と表示、サーバーへの返信のポストなどの基本を構築するのは非常に簡単でした。

ここで、それを次のレベルに引き上げたいと思います。アプリはすべてのデータをデバイスのローカルに保存し、定期的にサーバーと同期して、最近の変更を取得し、ローカル DB を更新する必要があります。オンデマンドで変更をチェックしたくありません。定期的な更新は、更新の購読などのいくつかの優れた機能を可能にするため、より優れています。

残念ながら、サーバーは GCM に準拠していません (今後もそうなる予定はありません)。古き良きシンプルな Web サーバーであるため、同期を自分で実装する必要があります。

デバイスが起動してインターネットに接続する必要があるため、タイマーベースのチェックは悪い考えであると言われている別の質問へのコメントを見つけました。デバイスが独自のデータ同期を開始したときにキャッチする方がはるかに優れていますが、定期的なチェックなしでこれを処理する方法はありますか?

この問題に関する多くの議論に目を通しました。それらのほとんどは、ContentProvider、プロトコル、GCM/C2DM などのサービスについて議論しています。電力効率については何も見つかりませんでした。

では、アプリがバッテリーを消耗しないように同期を適切に行うにはどうすればよいでしょうか?

4

3 に答える 3

2

GCM を使用すると、サーバーが更新をプッシュできるため、更新が利用可能な場合にのみネットワークが使用されるため、ポーリングよりも電力効率が高くなります。確認するためだけに電話をチェックしてウェイクアップするため、タイムリーなポーリングよりもはるかに優れています。アップデート用

重要: C2DM は 2012 年 6 月 26 日に正式に廃止されました。これは、C2DM が新しいユーザーと割り当て要求の受け入れを停止したことを意味します。C2DM に新しい機能は追加されません。ただし、C2DM を使用するアプリは引き続き動作します。既存の C2DM 開発者は、Google Cloud Messaging for Android (GCM) と呼ばれる C2DM の新しいバージョンに移行することをお勧めします。詳細については、C2DM から GCM への移行に関するドキュメントを参照してください。開発者は、新しい開発に GCM を使用する必要があります。

ただし、GCM では取得できないため、ポーリング自体を使用する必要があります。アラーム マネージャーと不正確な繰り返しを使用することで、電力効率の高い方法で使用できます。

定期的にポーリングするのが最も電力効率の良い方法だと思います

サンプルコードを与える

public class MyScheduleReceiver extends BroadcastReceiver {

    // Restart service every 30 sec
    private static final long REPEAT_TIME = 1000 * 30 ;

    @Override
    public void onReceive(Context context, Intent intent) {
        AlarmManager service = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, MyStartServiceReceiver.class);
        PendingIntent pending = PendingIntent.getBroadcast(context, 0, i,
            PendingIntent.FLAG_CANCEL_CURRENT);
        Calendar cal = Calendar.getInstance();
        // Start 30 seconds after boot completed
        cal.add(Calendar.SECOND, 30);
        //
        // Fetch every 30 seconds
        // InexactRepeating allows Android to optimize the energy consumption
        service.setInexactRepeating(AlarmManager.RTC_WAKEUP,
            cal.getTimeInMillis(), REPEAT_TIME, pending);

        // service.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
        // REPEAT_TIME, pending);
    }
}

必要なマニフェスト項目を含めたより詳しい説明があります。)

于 2012-08-25T09:13:07.650 に答える
0

定期的なポーリングを行い、GCM を利用して Android クライアントに更新を通知する小さなサーバー側アプリを構築できます。

もちろん、ユーザーごとにポーリングする必要があるなど、他の問題が発生することもあります。

于 2012-08-25T09:53:28.433 に答える
0

良いアイデアはGCMですが、あなたが言ったように、それは不可能です。そんな時は、以下の方法がおすすめです。

  1. 可能であれば、WiFi経由で更新してください。これにより、データ転送がより迅速に行われる可能性が高くなり、デバイスの無線がアクティブになるのに必要な時間が短縮されます。
  2. まとめて転送します。1 つのファイルを転送しないで、別の転送を行うまで少し待ちます。代わりに、次から次へと転送します。これにより、無線がアクティブである必要がある時間が短縮されるため、バッテリー寿命が節約されます。
  3. 充電時に更新し、さらに更新します。デバイスが充電中の場合、バッテリーを消耗させることなく、ネットワーク接続をより長く維持できます。したがって、充電中に 24 時間のデータではなく、おそらく 3 日間のデータを同期し、通常は同期されない 2 日間のデータをユーザーが必要とする場合に備えてバッテリーを節約できます。

ネットワークを使用する際の効率に関する IO 2012 のこのセッションを視聴することもできます。

于 2012-08-25T10:08:16.553 に答える