android 通过Service和Receiver来监听网络状态

注:本内容部分来自网络

需要在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>

猜你喜欢

转载自zdpeng.iteye.com/blog/1981584
今日推荐