连接性广播接收器在intent.getExtras()中始终返回null

10


我正在尝试接收来自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));

            }
        }

简而言之,extras始终为空。我以为如果我的WiFi连接断开,我应该会得到EXTRA_NO_CONNECTIVITY(因为这是通往互联网的唯一方式),或者至少从列表中得到一些信息。但是没有运气。当我断开WiFi接收器时,接收器会收到消息,但extras为空。当我再次打开WiFi时,接收器会再次触发,但是没有extras...为什么?如何知道应用程序失去了任何网络连接?我以为这是方法。

2个回答

16

你无法获得额外的数据,但可以通过这种方式获取数据

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


如果(!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)),但是过滤器中只添加了CONNECTIVITY_ACTION,这个我无法理解。 - Muhammad Babar
1
@MuhammadBabar 如果您仅为连接性注册了一个操作,则可以忽略检查操作的条件。 - Dharmendra
为了检查我们是否有互联网连接,仅使用“!intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,false)”是安全的吗? - android developer

5

Dharmendra的回答很好。不过请注意,EXTRA_NETWORK_INFO现已弃用(自Api Level 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
    }
}

假设你在注册广播的活动内部。
这样做还有一个额外的好处,即遵循尽可能短暂地仅监听连接广播的最佳实践,在此处概述 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接