Android Press Backing或主页按钮会导致连接更改?

时间:2011-12-15 00:32:36

标签: java android back-button connectivity android-homebutton

我有一个奇怪的问题。我有一段非常简单的代码,只要有人连接到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查看导致连接更改?有没有人知道如何轻松区分这些按钮按下和有效的连接变化。


由于一些工作,这是解决方案的一部分。

首先,我有两个类,一个活动类和一个服务类。在我的activity类中,每当调用onPause和onDestroy时,我都会使用广播接收器在服务类中设置一个变量。 (当用户按下这些按钮时会触发这些按钮)。服务类中的接收者获取此意图并设置公共变量。

然后在onResume的活动类中,我检查这个变量,并向服务发送另一个意图,将变量重置为默认状态。在这里我还设置了一个本地标志。当我正在进行任何处理时,我只需事先检查该标志并正确处理它。

1 个答案:

答案 0 :(得分:1)

我也可以确认我的应用程序中的行为。我不相信它是回击或回家的行为真正导致了这一点,而是由于后面或家庭(家庭情况下的小部件,我想)现在正在恢复的任何东西碰巧使用网络连接,请求或开始使用连接并且具有触发广播接收器的效果。

如果您不想回应这些误报,您可以对您的BroadcastReceiver获取的Intent进行更多处理,并可能跟踪接收器中的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);