【发布时间】:2010-12-19 11:31:45
【问题描述】:
我想检查 Android 手机网络何时关闭。我可以捕捉那个事件吗?
我没有得到正确的 API 或任何可以解释相同的示例。如果有人做过或任何示例链接将非常有帮助。
【问题讨论】:
标签: java android networking android-networking
我想检查 Android 手机网络何时关闭。我可以捕捉那个事件吗?
我没有得到正确的 API 或任何可以解释相同的示例。如果有人做过或任何示例链接将非常有帮助。
【问题讨论】:
标签: java android networking android-networking
新的java类:
public class ConnectionChangeReceiver extends BroadcastReceiver
{
@Override
public void onReceive( Context context, Intent intent )
{
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_MOBILE );
if ( activeNetInfo != null )
{
Toast.makeText( context, "Active Network Type : " + activeNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show();
}
if( mobNetInfo != null )
{
Toast.makeText( context, "Mobile Network Type : " + mobNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show();
}
}
}
AndroidManifest.xml 中“manifest”元素下的新 xml:
<!-- Needed to check when the network connection changes -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
AndroidManifest.xml 中“application”元素下的新 xml:
<receiver android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver"
android:label="NetworkConnection">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
【讨论】:
CONNECTIVITY_CHANGE。您需要动态地执行此操作。
我一直在使用小型设置来检查带宽以确定如何缩放图像等内容。
在Activity下,在AndroidManifest中:
<intent-filter>
...
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
在执行检查的活动中:
boolean network;
int bandwidth;
@Override
public void onCreate(Bundle savedInstanceState) {
...
network = isDataConnected();
bandwidth = isHighBandwidth();
registerReceiver(new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
network = isDataConnected();
bandwidth = isHighBandwidth();
}
}, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
...
}
...
private boolean isDataConnected() {
try {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo().isConnectedOrConnecting();
} catch (Exception e) {
return false;
}
}
private int isHighBandwidth() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info.getType() == ConnectivityManager.TYPE_WIFI) {
WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
return wm.getConnectionInfo().getLinkSpeed();
} else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
return tm.getNetworkType();
}
return 0;
}
一个示例用法是:
if (network) {
if (bandwidth > 16) {
// Code for large items
} else if (bandwidth <= 16 && bandwidth > 8) {
// Code for medium items
} else {
//Code for small items
}
} else {
//Code for disconnected
}
这不是最漂亮的,但它提供了足够的灵活性,我可以根据项目的内容和我对它们的要求来更改项目的带宽截止。
【讨论】:
如果您可以选择使用Android Annotations,请在您的活动中尝试此选项 - 仅此而已,其余部分会生成:
@Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION,
registerAt = Receiver.RegisterAt.OnResumeOnPause)
void onConnectivityChange() {
//react
}
仅当您已经使用 AndroidAnnotations 时才使用它 - 将此依赖项放入您的项目中仅为这段代码将是矫枉过正。
【讨论】:
上述答案仅在启用移动数据包数据时有效。否则,ConnectivityManager 将为空,您无法再检索 NetworkInfo。解决方法是改用 PhoneStateListener 或 TelephonyManager。
【讨论】: