【问题标题】:Android Pressing Back or home button causes Connectivity change?Android 按返回或主页按钮会导致连接更改?
【发布时间】:2012-01-20 18:29:21
【问题描述】:

我遇到了一个奇怪的问题。我有一段非常简单的代码,旨在每当有人连接到 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 视为导致连接更改?有没有人知道如何轻松区分这些按钮按下和有效的连接更改。


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

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

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

【问题讨论】:

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


    【解决方案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);
    

    【讨论】:

    • 非常正确的评论。我意识到了这一点,并添加了一些额外的检查。如果有人对此感兴趣,我编辑了我的问题以概述我是如何解决它的。
    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多