【问题标题】:BroadcastReceiver for CONNECTIVITY_ACTION always returns null in intent.getExtras()CONNECTIVITY_ACTION 的 BroadcastReceiver 在 intent.getExtras() 中始终返回 null
【发布时间】:2015-11-11 01:51:07
【问题描述】:


我正在尝试从 CONNECTIVITY_ACTION 接收广播消息:

    // register BroadcastReceiver on network state changes
    final IntentFilter mIFNetwork = new IntentFilter();
    mIFNetwork.addAction(android.net.ConnectivityManager.CONNECTIVITY_ACTION); //"android.net.conn.CONNECTIVITY_CHANGE"
    registerReceiver(mIRNetwork, mIFNetwork);

接收者是:

private BroadcastReceiver mIRNetwork = new BroadcastReceiver() {
    @Override
    public void onReceive(final Context context, final Intent intent) {

        android.util.Log.i(TAG,"mIRNetwork: Network State Received: "+intent.getAction());
        Bundle extras = intent.getExtras();
        if (extras!=null){
                android.util.Log.i(TAG,"mIRNetwork: ACTION_BACKGROUND_DATA_SETTING_CHANGED: "+extras.getString(ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED));
                android.util.Log.i(TAG,"mIRNetwork: CONNECTIVITY_ACTION: "+extras.getString(ConnectivityManager.CONNECTIVITY_ACTION));
                android.util.Log.i(TAG,"mIRNetwork: EXTRA_EXTRA_INFO: "+extras.getString(ConnectivityManager.EXTRA_EXTRA_INFO));
                android.util.Log.i(TAG,"mIRNetwork: EXTRA_NO_CONNECTIVITY: "+extras.getString(ConnectivityManager.EXTRA_NO_CONNECTIVITY));
                android.util.Log.i(TAG,"mIRNetwork: EXTRA_REASON: "+extras.getString(ConnectivityManager.EXTRA_REASON));

            }
        }

简而言之,额外内容始终为空。我认为如果我失去 WiFi 连接,我应该得到 EXTRA_NO_CONNECTIVITY(因为它是上网的唯一途径)或者至少是列表中的一些东西。但没有运气。如果我断开我的 WiFi AP 接收器的连接,则会收到他的消息,但附加信息为零。当我再次打开我的 WiFi 时,接收器会开火,但没有其他功能……这是为什么呢?如何知道该应用程序丢失了任何网络连接?我认为它的方式。

【问题讨论】:

    标签: android networking android-intent broadcastreceiver connectivity


    【解决方案1】:

    你不能得到额外的,但你可以通过这种方式获取数据

    private class ConnectivityBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager
                    .EXTRA_NO_CONNECTIVITY, false);
            NetworkInfo info1 = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager
                    .EXTRA_NETWORK_INFO);
            NetworkInfo info2 = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager
                    .EXTRA_OTHER_NETWORK_INFO);
            String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);
            boolean failOver = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);
            Log.d("MY_TAG", "onReceive(): mNetworkInfo=" + info1 + " mOtherNetworkInfo = " +
                    (info2 == null ? "[none]" : info2 + " noConn=" + noConnectivity));
        }
    }
    

    有关更多信息,请参阅此

    http://code.google.com/p/androidwisprclient/source/browse/trunk/src/com/joan/pruebas/NetworkConnectivityListener.java?r=2

    【讨论】:

    • 当添加到过滤器的唯一操作是 CONNECTIVITY_ACTION 时,if(!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) 无法理解这一点?
    • @MuhammadBabar 如果您只注册了一项连接操作,则可以忽略条件来检查操作。
    • 为了检查我们是否有互联网连接,只使用“!intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)”是否安全?
    【解决方案2】:

    Dharmendras answer 很好。但是,请注意 EXTRA_NETWORK_INFO 现在已弃用(自 Api 级别 14 起),Android 文档说明如下:

    由于 NetworkInfo 会因 UID 而异,因此应用程序应始终通过getActiveNetworkInfo() 获取网络信息。

    这实际上使我们的事情变得非常容易。您可以重复使用之前可能执行的连接检查并执行以下操作:

    private class ConnectivityBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            unregisterReceiver(this)
            checkConnection();
        }
    }
    
    private void checkConnection() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo()
                .isConnectedOrConnecting()) {
            // do something
        }
    }
    

    当然,假设你在注册广播的活动中。

    这还有一个额外的好处,那就是遵循尽可能简短地只收听连接广播的最佳实践,outlined here :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 2016-05-31
      • 2015-08-15
      • 2012-03-18
      • 2016-11-04
      • 2016-07-28
      相关资源
      最近更新 更多