1

UDP ブロードキャスト パケットの受信に大きな問題があります。私はおかしくなりそうだ...

問題は:

1-すべて正常に動作します。

2-パケットを受信できます。

3-Androidを閉じない場合(ホームボタンまたはキーオフが押されていない場合)、Androidをスリープ状態にします(画面オフ-> OnPauseおよびOnStop)

4-アクセスポイントをオフにします(外出をシミュレートするため、Wi-Fiなし)。

5-2分待ちます

6-アクセスポイントの電源を入れる

7-Android が起動すると、このシナリオでは常にタイムアウトが発生します。

別の時間にアプリを起動すると、Eclipse-> Timeout

アプリを破棄し (戻るボタン)、アプリを再起動 (onCreate) すると --> タイムアウト

ホームボタンを押してウェイクアップすると->タイムアウト

wifiを無効にしてから有効にすると-> OK、パケットを受信します

キーオフを押してウェイクアップすると-> OK、パケットを受信します

                Asycntask do in background{
                .....
                byte[] message = new byte[1500];
                s = new DatagramSocket(null);
                s.setReuseAddress(true);
                s.bind(new InetSocketAddress(dataclass.getDataclass().GGGPort));
                p = new DatagramPacket(message, message.length);
                s.setSoTimeout(500);
                s.setBroadcast(true);
                dataclass.getDataclass().setGoOut(true);
                s.receive(p);
                }

質問:

1-Androidを起動するためのホームボタンとキーオフボタンの違いは何ですか? 彼らは同じことをします-> OnPause、OnStop--> (ロック解除) OnRestart。wifiはどうなるの?

2-プログラムが実行されているのに受信していない場合、wifiを無効/有効にすると問題なく動作するのはなぜですか? それはコードがOKであることを意味します...それはアンドロイドの問題ですか?

PD: Asynctask OnStop を強制終了し、再起動時に実行します

4

2 に答える 2

0

このスレッドは問題を扱っています: https://groups.google.com/forum/?fromgroups=#!topic/android-platform/OpbSdp9FTmA

基本的に、解決策は

PARTIAL_WAKE_LOCKを取得し、画面が消えるとトラップします。次に、wifi を無効にして再度有効にします。これは、画面がオフになったときにのみフィルターがオンになるため、機能します。したがって、画面をオフにしてwifiを開始すると、画面が再びオフになるまで機能し続けます.

于 2014-08-28T21:32:54.450 に答える
0

バッテリーを節約するためにAndroidでWiFiがオフになっていることが問題である可能性があると思います。WIFi を再開する正確な条件はわかりませんが、おそらくパケットを送信すると有効になります。

WiFi を維持してパケットを受信するには、WifiManager.WifiLockを使用する必要がある場合があります。MulticastLockもありますが、必要ないようです。

ドキュメントから:

Wi-Fi 無線の起動状態を維持することをアプリケーションに許可します。通常、ユーザーがデバイスをしばらく使用していない場合、Wi-Fi 無線はオフになることがあります。WifiLock を取得すると、ロックが解除されるまで無線がオンのままになります。

WifiLock を使用する前に、アプリケーションが Wi-Fi アクセスを必要とするかどうか、または可能であればモバイル ネットワーク上で機能できるかどうかを慎重に検討してください。大きなファイルをダウンロードする必要があるプログラムは、ダウンロードが確実に完了するように WifiLock を保持する必要がありますが、ネットワークの使用が不定期または低帯域幅であるプログラムは、バッテリ寿命に悪影響を及ぼさないようにするために、WifiLock を保持するべきではありません。

WifiLock を使用するアプリケーションは、アプリケーションのマニフェストの要素で android.permission.WAKE_LOCK パーミッションを要求する必要があります。

于 2014-03-03T16:53:00.920 に答える