2011-12-15 67 views
1

我有一個奇怪的問題。我有一段非常簡單的代碼,意思是當有人連接到一個wifi接入點時觸發。Android按返回或主頁按鈕會導致連接更改?

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視爲導致連接更改?有沒有人有任何想法如何輕鬆區分這些按鈕和有效的連接變化。


這是解決方案的一部分,謝謝一些工作。

首先,我有兩個類,一個活動類和一個服務類。在我的activity類中,每當調用onPause和onDestroy時,我都會使用廣播接收器在服務類中設置一個變量。 (當用戶按下這些按鈕時會觸發這些按鈕)。服務類中的接收器挑選這個意圖並設置公共變量。

然後在活動類onResume中,我檢查這個變量,併發送另一個意圖給服務,以將變量重置爲默認狀態。在這裏我也設置了一個本地標誌。當我做任何處理時,我只需事先檢查該標誌並妥善處理。

回答

1

我可以確認我的應用程序中的行爲。我不認爲這是真正導致這種情況的回扣或家庭行爲,而是因爲後面或家庭(我認爲在家庭情況下的小部件)正在恢復的東西恰好使用網絡連接,請求或開始使用連接,並有觸發您的廣播接收器的影響。

如果您不想回應這些誤報,您可以對BroadcastReceiver獲取的Intent進行更多的處理,並且可能會跟蹤接收器中的WiFi連接狀態,以便在您收到另一個時不會採取某些措施CONNECTIVITY_ACTION但知道wifi已經連接。

繞開這些文檔的arent超清晰,但這裏有一些您可以檢查有關的意圖,可以幫助你決定是否需要做一些額外的事情:

// 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 2012-01-04 19:17:21