启用wi-fi时,请勿接收移动状态更改事件

时间:2013-06-13 08:43:55

标签: android

我需要在启用/禁用移动数据时收到通知。为此,我使用BroadcastReceiver并注册到ConnectivityManager.CONNECTIVITY_ACTION事件。但是,仅在禁用Wi-Fi时才会触发该事件。一旦启用Wi-Fi,我就会在启用/禁用移动数据时停止获取任何事件。

有什么想法吗? 无论Wi-Fi状态如何,我都需要接收移动数据状态变化事件。

4 个答案:

答案 0 :(得分:0)

  1. 倾听ConnectivityManager.CONNECTIVITY_ACTION

  2. Broadcast Receiver中,检查收到的意图并获取网络信息

    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
        final NetworkInfo networkInfo = 
            intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
    
  3. 检查

    if ((networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) && !networkInfo.isConnected()
    

    移动数据不可用

  4. 其他明智的案例

    if (networkInfo.isConnected() && (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
    

    移动数据可用

  5. 要更新您的UI,您可以使用连接管理器读取移动数据的当前状态,如:

    ConnectivityManager cm = (ConnectivityManager)applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    
    public boolean isNetworkAvailable() {
            boolean status = false;
            try {
    
                final NetworkInfo netInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
                if ((netInfo != null) && (netInfo.getState() == NetworkInfo.State.CONNECTED)) {
                    status = true;
                }
            } catch (final Exception e) {
                TLog.e(LOG, "Error Getting Mobile Network State");
                return false;
            }
            return status;
    
        }
    

答案 1 :(得分:0)

问题是当用户连接到WiFi时,设备将停止使用移动数据。因此,启用和禁用它将无效。

ConnectivityManager.CONNECTIVITY_ACTION只是通知已建立或丢失的连接。因此,当您使用WiFi时,无论是启用还是禁用,都无法通过移动网络连接来检测这些更改。

因此我不确定在连接到WiFi时可以检测移动数据状态的变化

答案 2 :(得分:0)

嗯,在这种特殊情况下,不确定是否可以依赖来自ConnectivityManager.CONNECTIVITY_ACTION的通知。

但是,如果您想阅读是否在任何时候启用/禁用移动数据设置。

您可以使用以下内容:

ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

Method method = conn.getClass().getDeclaredMethod("getMobileDataEnabled");

boolean isMobileDataEnabled = (Boolean)method.invoke(conn);

答案 3 :(得分:0)

我测试了两个动作接收器。

1

ConnectivityManager.CONNECTIVITY_ACTION;

如果wifi连接,则无法启用或禁用移动数据。

2

TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED = "android.intent.action.ANY_DATA_STATE" 

(隐藏)

如果连接了wifi,它可以禁用移动数据。,并且无法接收移动数据。

我的测试设备是三星Galaxy S4 mini LTE韩国型号(SHV-E370K)不是全球型号(GT-I9195)

==========================================

如果wifi连接,系统不会调用dataEnabled(因为不需要移动数据)。

因此无法接收移动设备状态(实际上,移动数据未被接受)

我决定安排计时器(句点= 10000毫秒)并检查getMobileDataEnabled()

private Method connectivityManager_getMobileDataEnabled = null;
private Method getConnectivityManager_getMobileDataEnabled() throws NoSuchMethodException {

    if (connectivityManager_getMobileDataEnabled == null) {
        connectivityManager_getMobileDataEnabled = ConnectivityManager.class.getMethod(
                "getMobileDataEnabled",
                new Class[0]);
    }

    return connectivityManager_getMobileDataEnabled;
}

public boolean getMobileDataEnabled() 
        throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

    Method getMobileDataEnabled = getConnectivityManager_getMobileDataEnabled();
    getMobileDataEnabled.setAccessible(true);
    return (Boolean) getMobileDataEnabled.invoke(mConnectivityManager);
}