启用/禁用移动数据的侦听器(未连接或断开连接)

时间:2014-02-20 02:17:45

标签: android

我测试了一些动作(见下文)。

ConnectivityManager.CONNECTIVITY_ACTION
WifiManager.NETWORK_STATE_CHANGED_ACTION
PhoneStateListener.LISTEN_DATA_CONNECTION_STATE (it is not actually action)
PhoneStateListener.LISTEN_DATA_CONNECTION_STATE (it is not actually action)

但他们只听状态(连接或断开连接)。

当wifi断开连接时,它可以收听(启用移动数据 - >连接 - >广播 - >听众)

当wifi连接时,它无法收听(启用移动数据 - >连接性不会改变!)

我需要启用或不启用移动数据设置

我可以收听启用或停用的移动数据吗?

2 个答案:

答案 0 :(得分:2)

虽然系统没有为此广播,但我们实际上可以使用ContentObserver来通知用户何时切换移动数据设置。

e.g:

ContentObserver mObserver = new ContentObserver(new Handler()) {
    @Override
    public void onChange(boolean selfChange, Uri uri) {
         // Retrieve mobile data value here and perform necessary actions
    }
};

...

Uri mobileDataSettingUri = Settings.Secure.getUriFor("mobile_data");
getApplicationContext()
                .getContentResolver()
                .registerContentObserver(mobileDataSettingUri, true,
                        observer);

不要忘记取消注册观察员! E.g。

getContentResolver().unregisterContentObserver(mObserver);

答案 1 :(得分:1)

因此,在深入挖掘它之后,当该值发生变化时,似乎不会发送任何广播。甚至Android设置应用中的移动网络设置片段也不会监听更改;它只会检入onCreate()onResume()。因此,您似乎无法监听进行更改,但您可以获得当前状态。不幸的是,它是一个私有API,所以你必须使用反射:

public static boolean isMobileDataEnabled(Context ctx) {
    try {
        Class<?> clazz = ConnectivityManager.class;
        Method isEnabled = clazz.getDeclaredMethod("getMobileDataEnabled", null);
        isEnabled.setAccessible(true);
        ConnectivityManager mgr = (ConnectivityManager) 
                ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
        return (Boolean) isEnabled.invoke(mgr, null);
    } catch (Exception ex) {
        // Handle the possible case where this method could not be invoked
        return false;
    }
}