1

私のアプリはバックグラウンドで (サービスとして) 実行されており、メッセージを送受信するために常にリモート サーバーに接続する必要があります。

このサービスは、サーバーへの接続を管理するスレッドを実行します (ソケットを使用)

インターネットの状態が変更されるたびに実行され、状態が接続されているか切断されているかを確認するインターネット接続ブロードキャストレシーバーを作成しようとしています。

私の問題は次のとおりです。Wi-Fiネットワークに接続すると、ブロードキャストレシーバーインテントが数回起動されますが、そのすべてでインターネット接続の状態はtrueです(すべての火災の間に切断はありません。つまり、ほとんどありませんソケットを使用してサーバーに接続する新しいスレッド。

インターネットの状態を正しく取得していることを確認するにはどうすればよいですか。つまり、接続が接続されている場合にのみ .isConnected() メソッドが返されるということですか?

これは私のコードです:

public void onReceive(Context context, Intent intent) 
{       
    action = intent.getAction();
    app = (AppVariables) context.getApplicationContext();       
    if (app.isApplicationInitilized())
    {   
        if (action.equals(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)))
        {
            networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            if (networkInfo.isConnected())
                app.getServerConnectionManager().startServer();
        }
        else if(action.equals(ConnectivityManager.CONNECTIVITY_ACTION))
        {
            networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);                
            if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI && !networkInfo.isConnected())
                app.getServerConnectionManager().stopServer(false);
            else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE && !networkInfo.isConnected())
                app.getServerConnectionManager().stopServer(false);
            else
                app.getServerConnectionManager().startServer();
        }           
    }       
}
4

2 に答える 2

0

私が正しく理解しているなら、あなたは接続の状態を知る必要があります。networkInfo状態を使用してそれを取得できます。

状態state=networkInfo.getState();

if(state == State.CONNECTED)do_something

于 2012-11-26T16:15:20.060 に答える
0

私のアプリの 1 つで同じ問題が発生しました。デプロイした (成功した) パターンは次のとおりです。

onReceive():
   if( networkInfo.isConnected() ) 
       fireTimerForSecondaryCheck();
   else
       not connected;

SecondaryCheck:
     if( loadKnownUrl() )
          is connected.
          fire long timer for secondary check
     else
          fire short timer for secondary check

基本的に、これが行うことは、ネットワーク マネージャーが Wi-Fi が稼働していることを報告すると、インターネットへのアクセスを試みることです。期待どおりのコンテンツを受信した場合、ネットワーク接続は稼働しており、2 分後に再度確認します。期待したコンテンツを受信できない場合は、ネットワーク接続が完全に確立されていないか、インターネットに接続できないか、Wi-Fi に TOS などのランディング ページがある可能性があります。その場合は、10 秒後に再度確認します。

FWIW、私の NetworkMonitorService は私のアプリへの接続をブロードキャストし、それを登録し、必要に応じて UI を更新します。

これは 2.3.3 で開発されたもので、Android の新しいバージョン (4+) ではネットワーク状態の粒度がより細かくなっていると思いますが、本番環境ではこのコードを調整する必要はまだありません。2.2 デバイスから 4.2 まで問題なく動作します。

于 2012-11-26T16:10:55.543 に答える