【问题标题】:Intent action for network events in android sdkandroid sdk中网络事件的意图操作
【发布时间】:2011-01-18 16:39:20
【问题描述】:

我需要接收网络操作的广播,例如网络连接、断开连接等。我为此目的使用广播接收器。谁能告诉我我需要为网络事件捕获哪个意图操作,现在根据我在互联网上的搜索,我正在使用 android.net.ConnectivityManager.CONNECTIVITY_ACTION

这是我的广播接收器类:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class NetworkStateReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub


    if (intent.getAction().equals(
            android.net.ConnectivityManager.CONNECTIVITY_ACTION)) {

        // do something..
    }
}
}

并且我还添加了访问网络状态的权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

这是我在清单文件中声明这个类的方式

<receiver class=".NetworkStateReceiver" android:name=".NetworkStateReceiver">
    <intent-filter>
            <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" />
    </intent-filter>
</receiver>

如果我错了,或者如果有任何其他方法可以捕获网络事件,请建议我正确的意图操作。

【问题讨论】:

    标签: android intentfilter android-networking


    【解决方案1】:

    这是一个工作示例:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
    <receiver android:name=".receiver.ConnectivityReceiver">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>
    

    .

    public class ConnectivityReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(ConnectivityReceiver.class.getSimpleName(), "action: "
                    + intent.getAction());
        }
    
    }
    

    【讨论】:

    • 根据我的测试,无论 wlan 现在是向上/向下还是 3g 现在是向上/向下,我都不需要任何权限来接收广播。我有点困惑,那么 android.net.conn.CONNECTIVITY_CHANGE 有什么用?
    • 如果你再看一遍,你会发现 CONNECTIVITY_CHANGE 不是一个权限,它正在注册一个意图接收器(你也可以在代码中这样做)。
    • 答案看起来和问题一样。那么为什么在答案之前它不起作用?
    • 这个答案只是修复了清单中的意图操作名称。 android.net.ConnectivityManager.CONNECTIVITY_ACTIONandroid.net.conn.CONNECTIVITY_CHANGE,它与意图操作匹配。
    • 这段代码有效,但它只告诉你“连接变化”有没有办法判断它是连接还是断开?
    【解决方案2】:

    yanchenko 的回答非常有用,我只是稍微简化一下以获取连接状态,请修改 onReceive 如下:

    public class ConnectivityReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(ConnectivityReceiver.class.getSimpleName(), "action: "
                    + intent.getAction());
            MyConstants.IS_NETWORK_AVAILABLE = haveNetworkConnection(context);
            //IS_NETWORK_AVAILABLE this variable in your activities to check networkavailability.
    
        } 
    
    
        private boolean haveNetworkConnection(Context context) {
            boolean haveConnectedWifi = false;
            boolean haveConnectedMobile = false;
    
            ConnectivityManager cm = (ConnectivityManager)   context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo[] netInfo = cm.getAllNetworkInfo();
            for (NetworkInfo ni : netInfo) {
                if (ni.getTypeName().equalsIgnoreCase("WIFI"))
                    if (ni.isConnected())
                        haveConnectedWifi = true;
                if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
                    if (ni.isConnected())
                        haveConnectedMobile = true;
            }
            return haveConnectedWifi || haveConnectedMobile;    
        }
    }
    

    【讨论】:

    • 在 Ravi K Sharma,您知道 android.net.ConnectivityManager.EXTRA_NO_CONNECTIVITY 吗?这是自 API 级别 1 以来 Intent extras 中的一个额外布尔值,用于判断是否存在连接。
    • 关于昨天的评论,我注意到它并不准确。至少在某些情况下,似乎 EXTRA_NO_CONNECTIVITY 仅在没有连接时才添加到 Intent extras 中。因此,使用 getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) 访问它应该会产生一个布尔值,如果根本没有连接则为真,如果有任何连接则为假。此外,这个答案中的代码是一个反模式,因为分析是有限的。它不会检测蓝牙网络共享、USB 网络共享或 LAN 连接。不要那样做。
    • 此代码的归属,因为 Ravi 忘记了它:stackoverflow.com/a/4239410/182653
    • 为什么不直接获取getActiveNetworkInfo() 并检查它是否已连接并完成?
    • 是的 Ε Г И І И О,如果您不需要知道所连接的连接类型,您是对的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多