我测试了一些动作(见下文)。
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连接时,它无法收听(启用移动数据 - >连接性不会改变!)
我需要启用或不启用移动数据设置
我可以收听启用或停用的移动数据吗?
答案 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;
}
}