(原创)用Receiver和SystemService监听网络状态,注册Receiver的两种方式

时间:2023-05-07 17:50:43

android中网络编程不可避免地要监听网络状态,wifi或者3G以及以太网,并根据当前状态做出相应决策.

在MyReceiver类中的onReceive方法中获得系统服务

ConnectivityManager manager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if(wifiInfo.isConnected){
Toast.makeText(context, "wifi isConnected", Toast.LENGTH_SHORT).show();
return;
}else if(mobInfo.isConnected()){
Toast.makeText(context, "mob isConnected", Toast.LENGTH_SHORT).show();
return;
}else{
Toast.makeText(context, "none is Connected", Toast.LENGTH_SHORT).show();
return;
}

静态注册方法:

<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>

或者动态注册方法(MainActivity中):

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
myReceiver = new myWifiReceiver();
registerReceiver(myReceiver, filter);
} @Override
protected void onDestroy() {
unregisterReceiver(myReceiver);
super.onDestroy();
}

权限:

 <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

这里要注意两点:

1.动态注册并且onDestroy()时解除注册的话,退出后就不接受广播了.

但是再次打开应用时会执行onReceive()方法.

2.较高api版本中要求打开过应用广播接收者才会生效.