聆听ConnectivityManager.CONNECTIVITY_ACTION
的意图,它似乎只适用于连接更改(连接/断开连接)或从wifi更改为移动设备等。
但在移动连接中,如果2G, 3G, 4G,
之间的更改无法获得任何意图广播。
我希望2G connection
上的应用停用,或3G/4G connection
启用。该应用程序将在后台运行。所以需要倾听变化。
有可能实现吗?
我还想知道系统如何监听网络类型的变化并在通知中显示如上图所示。
答案 0 :(得分:3)
通过在TelephonyManager中使用getNetworkType方法,我们可以识别其2G或3G。
public String getNetworkClass(Context context) {
TelephonyManager mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
int networkType = mTelephonyManager.getNetworkType();
switch (networkType) {
case TelephonyManager.NETWORK_TYPE_GPRS:
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_CDMA:
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_IDEN:
return "2G";
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_EVDO_A:
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_EVDO_B:
case TelephonyManager.NETWORK_TYPE_EHRPD:
case TelephonyManager.NETWORK_TYPE_HSPAP:
return "3G";
case TelephonyManager.NETWORK_TYPE_LTE:
return "4G";
default:
return "Unknown";
}
}
然后使用BroadcastReceiver
private class NetworkSwitcher extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
return;
}
NetworkInfo networkInfo =
(NetworkInfo)intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if (networkInfo.isConnected()) {
Log.d(TAG, "Network type: " + networkInfo.getTypeName() +
" Network subtype: " + networkInfo.getSubtypeName());
// check your condition here
}
else {
Log.e(TAG, "Network connection lost");
}
}
}
有关详细信息,请参阅android.telephony.TelephonyManager
答案 1 :(得分:0)
还需要收听有关LISTEN_DATA_CONNECTION_STATE的phonestatelistener,这将报告每次发生变化时的移动网络类型。