我需要在启用/禁用移动数据时收到通知。为此,我正在使用 BroadcastReceiver 并注册到 ConnectivityManager.CONNECTIVITY_ACTION 事件。但是,只有在禁用 Wi-Fi 时才会触发该事件。启用 Wi-Fi 后,我在启用/禁用移动数据时停止收到任何事件。
有任何想法吗?无论 wi-fi 状态如何,我都需要接收移动数据状态更改事件。
我需要在启用/禁用移动数据时收到通知。为此,我正在使用 BroadcastReceiver 并注册到 ConnectivityManager.CONNECTIVITY_ACTION 事件。但是,只有在禁用 Wi-Fi 时才会触发该事件。启用 Wi-Fi 后,我在启用/禁用移动数据时停止收到任何事件。
有任何想法吗?无论 wi-fi 状态如何,我都需要接收移动数据状态更改事件。
好吧,不确定在这种特殊情况下您是否可以依赖来自 ConnectivityManager.CONNECTIVITY_ACTION 的通知。
但是,如果您想了解移动数据设置是否在任何时候启用/禁用。
您可以使用以下内容:
ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
Method method = conn.getClass().getDeclaredMethod("getMobileDataEnabled");
boolean isMobileDataEnabled = (Boolean)method.invoke(conn);
问题是当用户连接到 WiFi 时,设备将停止使用移动数据。所以启用和禁用它不会有任何效果。
ConnectivityManager.CONNECTIVITY_ACTION 仅通知已建立或丢失的连接。因此,当您使用 WiFi 时,无论启用还是禁用,都没有移动网络连接来检测这些更改。
因此,我不确定是否可以在连接到 WiFi 时检测到移动数据状态的变化
聆听ConnectivityManager.CONNECTIVITY_ACTION
在您的Broadcast Receiver
中,检查收到的意图并获取网络信息
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
final NetworkInfo networkInfo =
intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
检查
if ((networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) && !networkInfo.isConnected()
移动数据不可用
以防万一
if (networkInfo.isConnected() && (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
移动数据可用
要更新您的 UI,您可以使用 Connectivity Manager 读取移动数据的当前状态,例如:
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.
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);
}