networking监听器Android

我想检查Android手机的networking何时closures。 我可以捕捉该事件吗?

我没有得到适当的API或任何可以解释相同的例子。 如果有人已经做了或任何示例链接将是真正有帮助的。

新的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(); } } } 

在“manifest”元素下的AndroidManifest.xml中添加新的xml:

 <!-- Needed to check when the network connection changes --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

在你的AndroidManifest.xml文件中的“application”元素下新build一个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> 

我一直在使用一个小的设置来检查带宽,以确定如何缩放事物,如图像。

在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注释是一个选项,你可以在你的活动中试试这个 – 剩下的就是生成了:

 @Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION, registerAt = Receiver.RegisterAt.OnResumeOnPause) void onConnectivityChange() { //react } 

只有当你已经使用AndroidAnnotations时才使用它 – 把这个依赖关系放在你的项目里面,这样做只会让这个代码变得过分。

以上的答案只适用于移动分组数据启用。 否则,ConnectivityManager将为空,您不能再检索NetworkInfo。 解决方法是使用PhoneStateListener或TelephonyManager。