1

奇妙な問題が発生しています。誰かがwifiアクセスポイントに接続するたびにトリガーすることを目的とした非常に単純なコードがあります。

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でこの変数をチェックし、別のインテントをサービスに送信して、変数をデフォルトの状態にリセットします。ここでは、ローカルフラグも設定します。処理を行うときは、事前にそのフラグを確認して適切に処理するだけです。

4

1 に答える 1

1

私のアプリでもその動作を確認できます。これを実際に引き起こしているのは、押し戻すまたは家に帰る行為であるとは思わない。むしろ、家に帰るまたは家に帰った結果として現在再開されているもの(ホームの場合はウィジェット)がたまたまネットワーク接続を使用しているとは思わない。接続を要求または使用を開始しましたが、これはブロードキャストレシーバーをトリガーする効果があります。

これらの誤検知に応答したくない場合は、BroadcastReceiverが取得するインテントをもう少し処理し、レシーバー内のWi-Fi接続状態を追跡して、別のCONNECTIVITY_ACTIONを取得したときにアクションを実行しないようにすることができます。 Wi-Fiはすでに接続されています。

これらのいくつかに関するドキュメントは非常に明確ですが、何かをする必要があるかどうかを判断するのに役立つ可能性のある意図について調べることができるいくつかの追加事項があります。

// 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);
于 2011-12-15T00:53:01.560 に答える