2011-12-15 9 views
1

私は奇妙な問題を抱えています。私は、誰かがWiFiアクセスポイントに接続するたびに起動するように作られた非常に単純なコードを持っています。Android Backまたはホームボタンを押すと接続が変更されますか?

IntentFilter ConnectedFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); 
getApplicationContext().registerReceiver(ConnectedToAPReceiver, ConnectedFilter); 

    private BroadcastReceiver ConnectedToAPReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
      final String action = intent.getAction(); 

      if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) 
      { 
       ConnectivityManager connManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE); 
       NetworkInfo Wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
       if (Wifi.isConnected()) 
       { 
         // If we get here, it means that the user has just connected to wifi. 
       } 
      } 
     } 
}; 

このコードは、私が必要とするものに対して非常にうまく機能します。しかし、私は奇妙な事態が発生しています。バックやホームボタンが押されると、放送受信機も起動します。また、アプリケーションをロードすると、これもトリガされます。

これらのボタンを押したことがAndroidで接続の変更を引き起こす原因として表示される理由は誰にも分かりますか?そして、誰もが、これらのボタン押下と有効な接続変更を簡単に区別する方法を知っていますか?


これは一部の作業のおかげで解決策の一部です。

まず、アクティビティクラスとサービスクラスの2つのクラスがあります。私のアクティビティクラスでは、onPauseとonDestroyが呼び出されるたびに、ブロードキャストレシーバを使用してサービスクラスに変数を設定します。 (これらはユーザーがこれらのボタンを押すとトリガーされます)。サービスクラスの受信者はこのインテントを取得し、パブリック変数を設定します。

次に、変数onResumeでこの変数をチェックし、別のインテントをサービスに送信して変数をデフォルト状態にリセットします。ここでも私はローカルフラグを設定します。私が何らかの処理をしているとき、私はそのフラグを事前にチェックし、それを適切に処理するだけです。

答えて

1

私のアプリでの動作も同様に確認できます。私はそれが本当にこれを引き起こしていることを押し戻す行為ではないと信じていません。むしろ、家や家の結果として現在再開されているもの(ホームケースのウィジェット、私が思う)は、接続を使用して要求または開始し、ブロードキャスト受信機のトリガーに影響します。

もしあなたがこれらの偽陽性に反応したくなければ、あなたのBroadcastReceiverが取得したインテントの処理をもう少しやりとりし、おそらく受信機内のWiFi接続状態を追跡して、 CONNECTIVITY_ACTIONが表示されていますが、wifiは既に接続されています。

// true when there is no connectivity whatsoever 
boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 

// lots of extra info & detailed state about the connection 
// see http://developer.android.com/reference/android/net/NetworkInfo.html 
NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 

NetworkInfo otherNetworkInfo = (NetworkInfo)intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO); 

String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON); 
boolean isFailover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false); 
+0

非常に正しいコメント:

これらのいくつかの周りのドキュメントは、あなたが何かをする必要があるかどうかを決定するのに役立つかもしれない意図について調べることができますいくつかの追加のものがあり、ここで、超クリアなアレントけど。私はこれを認識し、いくつかの追加チェックを追加しました。もし誰かがこれに興味があれば、私はそれをどのように解決するかを概説するために私の質問を編集しました。 – Dave

関連する問題