最近看到一篇博客,对于广播的解释实在是淋漓尽致。
http://www.cnblogs.com/trinea/archive/2012/11/09/2763182.html
从事android工作已经一年,对于广播的认识却非常少,我犯了一个严重的错误,也就是上述链接中提到的。
我一直尝试着取消注册广播,却一直取消不掉。
原因是我在配置文件中,和java代码中,都注册了。
通过registerReceiver注册的BroadcastReceiver在对其进行注册的Context对象"销毁"了或者调用了unregisterReceiver方法时也就失效了,而通过<receiver>标签注册的BroadcastReceiver只要应用程序没有被删除就一直有效。
接着说标题的内容:
先在配置文件中注明权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
接着写广播接收者内容:
package com.example.networkdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.os.Parcelable;
import android.util.Log;
public class NetBroadCastReciver extends BroadcastReceiver {
/**
* 只有当网络改变的时候才会 经过广播。
*/
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//判断wifi是打开还是关闭
if(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())){ //此处无实际作用,只是看开关是否开启
int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
switch (wifiState) {
case WifiManager.WIFI_STATE_DISABLED:
break;
case WifiManager.WIFI_STATE_DISABLING:
break;
}
}
//此处是主要代码,
//如果是在开启wifi连接和有网络状态下
if(ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if(NetworkInfo.State.CONNECTED==info.getState()){
//连接状态
Log.e("pzf", "有网络连接");
//执行后续代码
//new AutoRegisterAndLogin().execute((String)null);
//ps:由于boradCastReciver触发器组件,他和Service服务一样,都是在主线程的,所以,如果你的后续操作是耗时的操作,请new Thread获得AsyncTask等,进行异步操作
}else{
Log.e("pzf", "无网络连接");
}
}
}
}
接着别忘了注册广播,我这里写的是全局的注册
<receiver
android:name=".NetBroadCastReciver"
>
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>