永続ソケットを使用するAndroidデバイスのカスタムプッシュ通知ソリューションのテストを行っています。調査結果を共有し、結果を検証したいと思います。
簡単な説明
アプリケーションはフォアグラウンドサービスを実行し、サーバーとの接続を確立し、積極的なping(@ 10秒間隔)を介してその接続を維持します。接続が切断されたことが検出された場合、アプリは無期限に再接続を試み続けます。サーバーは、デュプレックスチャネルを介して通知を送信します。
テスト1:
Pinging is done using a timer at 10 second intervals.
Server sends notification every minute.
Applications acquires wifi and wake locks.
Duration : 8 hours
Battery loss : ~14%
テスト2:
Pinging is done using AlarmManager at 10 second intervals.
Server sends notification every minute.
Application acquires only a wifilock
Duration : 8 hours
Battery loss : ~7%
前提条件:着信ネットワークパケットは自動的にCPUをウェイクアップするため、ウェイクロックは必要ありません。 (タイマーの代わりに)AlarmManagerを使用してpingを実行するということは、ウェイクロックが必要ないことを意味します。
そのウェイクロックを取り除くことは本当にバッテリーを助けるようでした。驚いたことに、どちらのソリューションでも積極的にpingを実行しても、予想したほどバッテリーの寿命には影響しませんでした。 (アプリケーションがwifilockを保持し、同じ期間に約4%から5%のバッテリー損失を引き起こす何もしなかったテストを含む他の多くのテストがありました)
アプリケーションはすべてのping要求を正常に送信し、すべての受信メッセージを受信できたので、私の仮定は正しいと思います。しかし、私は専門家からいくつかの確認を得たいと思います。
もう1つの質問:アプリケーションが代わりに着信接続をリッスンする場合。この場合、ウェイクロックを保持する必要がありますよね?着信接続がCPUをウェイクアップしませんか?このルートをたどるつもりはありませんが、確認したかっただけです。
また、GCMは推奨しないでください。会社のポリシーにより除外されています。
ありがとう。
この質問にはある程度の関心があり、確認がないので、今すぐ回答します。テストが行われてからしばらく経ち、本番レベルのソリューションが作成され、厳密にテストされました。ウェイクロックを削除してもバッテリーは有効であり、ping要求の欠落や着信通知などの他の問題は検出されなかったため、上記の仮定で受け取った検証はこれだけです。
注意すべき追加事項:
Pingアラーム用のBroadcastReceiverのOnReceiveメソッドで、ソケットを直接呼び出していない場合(新しいスレッドまたはインテントを生成している場合)、ping要求が終了するまでウェイクロックを保持する必要があります。 Androidは、OnReceiveが戻るまでのみウェイクロックを保持します。その後、pingが終了する前にCPUがスリープする可能性があります(ただしまれです)。
通知が機密である場合は、 高性能Wifiロック を使用してください。
ソリューションに影響を与えたデバイス固有の問題がもう1つありました。これについては、 ここ で説明しています。
更新
Android 5.1: Android Issue で次の問題に遭遇しました
アップデート2
Android 6.0: Doze Mode のDozeモードを中心にコーディングする必要があります