永続的なソケットを使用して、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 はお勧めしません。会社のポリシーによって除外されています。
ありがとう。