注:本内容部分来自网络
需要在Activity中得到网络状态,就是需要在接收到网络状态改变的广播的时候,要能够与Activity进行交互,通知Activity当前的网络状态,这就需要写一个Service,并且绑定到Activity,把广播监听到的实时的网络状态返回给Activity。
package com.yooeee.ziyoutong.service; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.NetworkInfo.State; import android.os.Binder; import android.os.IBinder; import android.util.Log; public class ReceiveMsgService extends Service {// 实时监听网络状态改变 private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { Timer timer = new Timer(); timer.schedule(new QunXTask(getApplicationContext()), new Date()); } } }; public interface GetConnectState { public void GetState(boolean isConnected); // 网络状态改变之后,通过此接口的实例通知当前网络的状态,此接口在Activity中注入实例对象 } private GetConnectState onGetConnectState; public void setOnGetConnectState(GetConnectState onGetConnectState) { this.onGetConnectState = onGetConnectState; } private Binder binder = new MyBinder(); private boolean isContected = true; @Override public IBinder onBind(Intent intent) { return binder; } @Override public void onCreate() {// 注册广播 IntentFilter mFilter = new IntentFilter(); mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); // 添加接收网络连接状态改变的Action registerReceiver(mReceiver, mFilter); } class QunXTask extends TimerTask { private Context context; public QunXTask(Context context) { this.context = context; } @Override public void run() { if (isNetworkConnected(context) || isWifiConnected(context)) { isContected = true; } else { isContected = false; } if (onGetConnectState != null) { onGetConnectState.GetState(isContected); // 通知网络状态改变 Log.i("mylog", "通知网络状态改变:" + isContected); } } /* * 判断是3G否有网络连接 */ private boolean isNetworkConnected(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); if (mNetworkInfo != null) { return mNetworkInfo.isAvailable(); } } return false; } /* * 判断是否有wifi连接 */ private boolean isWifiConnected(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (mWiFiNetworkInfo != null) { return mWiFiNetworkInfo.isAvailable(); } } return false; } } public class MyBinder extends Binder { public ReceiveMsgService getService() { return ReceiveMsgService.this; } } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); // 删除广播 } }
接下来在Activity中,绑定服务
public class MainActivity extends Activity { protected String TAG = "mylog"; ReceiveMsgService receiveMsgService; private boolean conncetState = true; // 记录当前连接状态,因为广播会接收所有的网络状态改变wifi/3g等等,所以需要一个标志记录当前状态 @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.page_main); bind(); } private void bind() { Intent intent = new Intent(MainActivity.this, ReceiveMsgService.class); bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); } private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder service) { receiveMsgService = ((ReceiveMsgService.MyBinder) service) .getService(); receiveMsgService.setOnGetConnectState(new GetConnectState() { // 添加接口实例获取连接状态 @Override public void GetState(boolean isConnected) { if (conncetState != isConnected) { // 如果当前连接状态与广播服务返回的状态不同才进行通知显示 conncetState = isConnected; if (conncetState) {// 已连接 handler.sendEmptyMessage(1); } else {// 未连接 handler.sendEmptyMessage(2); } } } }); } }; private void unbind() { if (receiveMsgService != null ) { unbindService(serviceConnection); Log.i("mylog", "执行unbind()"); } } Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1:// 已连接 Toast.makeText(MainActivity.this, "网络已经连接" ,Toast.LENGTH_LONG).show(); break; case 2:// 未连接 Toast.makeText(MainActivity.this, "网络未连接" ,Toast.LENGTH_LONG).show(); break; default: break; } ; }; }; @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); unbind(); } }
当然也可以直接在Activity中注册一个广播,在接收到广播之后进行判断,这种情况就稍简单些,Activity可以直接访问到广播中的一些变量;最后,需要添加一些权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
单纯用广播来监控网络状态,前提是不需要与Activity通信
private ConnectivityManager connectivityManager; private NetworkInfo info; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { Log.d("mylog", "网络状态已经改变"); connectivityManager = (ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE); info = connectivityManager.getActiveNetworkInfo(); if(info != null && info.isAvailable()) { String name = info.getTypeName(); Log.d("mylog", "当前网络名称:" + name); } else { Log.d("mylog", "没有可用网络"); } } }
如果分别需要得到3G和WIFI连接方式如下:
ConnectivityManager connectMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); //3G NetworkInfo mobNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); //WIFI NetworkInfo wifiNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
最后别忘了在XML中注册广播,当然也可以在代码中注册广播。
<receiver android:name="com.yooeee.freepass.service.NetworkReceiver" android:label="NetworkConnection" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.intent.action.USER_PRESENT" /> </intent-filter> </receiver>