2011-12-15 63 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