有的Android应用程序有“联网”和“断网”两种连接方式,“断网”和“联网”有两种不同的界面,”断网“情况下调用断网的API,“联网”情况下调用“联网”的API,如果“断网”情况下调用联网的API,就会出现异常。应该是“联网”情况下如果断网,应该就应该调到“断网”的界面,并调用“断网”情况下的API。
1.能够检测网络,首先具有如下权限(访问网络的权限和访问网络状态的权限):
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2.在Manifest中配置BroadReceiver监测断网,action里面是网络连接变化时候来触发这个Receiver,如下所示:
<receiver
android:name=".ConnectionChangeReceiver"
android:label="NetworkConnection" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
3.BroadcastReceiver的实现代码如下:
public class ConnectionChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
//如果有网络连接中就直接退出
return;
}
}
}
}
//如果没有网络连接(网络已经断开)就采取相应的逻辑,跳到相应的界面。
SharedPreferences settings = context.getSharedPreferences(
Constant.PREFS_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(Constant.PREFS_NETWORK_ONLINE, false);
editor.commit();
intent.setClass(context, NetworkListActivity.class);
//在BroadcastReceiver(或者像Service那些没有界面的Android组件)中启动Activity,应该设置FLAG_ACTIVITY_NEW_TASK标记。
//清除所有的Activity,应该设置FLAG_ACTIVITY_CLEAR_TOP标记。
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
多谢 abcdefh123的专栏 分享。