問題の説明:
私のAndroidアプリでは、アラームが鳴った後に開始されたAsyncTaskからリモートHTTP(「ポーリング」)呼び出しを行うと、接続の問題が発生します。
Androidの標準設定である[常時オンのモバイルデータを有効にする]([設定]->[ワイヤレスとネットワーク]->[モバイルネットワーク])を[オン]にすると、ルックアップは非常にうまく機能します。
動作するソリューション:アラームが鳴り、Androidの「サービス」がアラームインテントを受信し、バックグラウンドスレッド(AsyncTask)を開始します。新しいスレッドは部分的なウェイクロックを取得し、接続を確立(ポーリング)し、ユーザーに通知してウェイクロックを解放します。
ここまでは順調ですね。問題は、常時オンが「オフ」になっている場合、電話がしばらく(> 30分)スタンバイ状態になっていると、ほとんどの場合、ポーリングが失敗することです。
ポーリングスレッドが通知を送信するので、失敗したポーリングの試行に関するフィードバックを直接受け取ります。
動機:
多くのユーザーは、バッテリーの消耗を減らすために「常時オン」をオンにします。そのため、アプリユーザーが問題に遭遇する可能性があります。ユーザーが直面する「エラー」を処理または防止したい。
解決策の試み:
私は大きなブレークスルーなしで多くの実験をしました:
- 電話に接続を確立するための時間を与えるための複数回の再試行と中間スリープ
- httpパラメータ(タイムアウトなど)
- 別のHttpClient(Apache)
質問:
- 「常時オン」の設定は正確には何を意味し、開発者は何を考慮する必要がありますか?
- 「常時オン」を「オフ」にしてもデータ接続を確立できるアラームベースのポーリングメカニズムを実装することは一般的に可能かと思います。
- 代替ソリューションはありますか(C2DMは不可能)?
アップデート:
すべてのAndroidデバイスが「常時オン」に設定されているわけではないようです。デバイスに依存しているようですが、プロバイダーに依存している可能性があります。