android 通过Service和Receiver来监听网络状态
2016-04-12 09:24
501 查看
注:本内容部分来自网络
需要在Activity中得到网络状态,就是需要在接收到网络状态改变的广播的时候,要能够与Activity进行交互,通知Activity当前的网络状态,这就需要写一个Service,并且绑定到Activity,把广播监听到的实时的网络状态返回给Activity。
Java代码
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); // 删除广播
}
}
Java代码
接下来在Activity中,绑定服务
Java代码
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可以直接访问到广播中的一些变量;最后,需要添加一些权限:
Xml代码
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
单纯用广播来监控网络状态,前提是不需要与Activity通信
Java代码
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连接方式如下:
Java代码
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中注册广播,当然也可以在代码中注册广播。
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>
需要在Activity中得到网络状态,就是需要在接收到网络状态改变的广播的时候,要能够与Activity进行交互,通知Activity当前的网络状态,这就需要写一个Service,并且绑定到Activity,把广播监听到的实时的网络状态返回给Activity。
Java代码
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); // 删除广播
}
}
Java代码
接下来在Activity中,绑定服务
Java代码
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可以直接访问到广播中的一些变量;最后,需要添加一些权限:
Xml代码
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
单纯用广播来监控网络状态,前提是不需要与Activity通信
Java代码
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连接方式如下:
Java代码
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中注册广播,当然也可以在代码中注册广播。
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>
相关文章推荐
- cocoapods使用时提示Error fetching http://ruby.taobao.org/: bad response Not Found 404
- https工作原理
- 哪些网站需要HTTPS(SSL证书)
- HttpClient入门实例
- Https 原理
- Bzoj2229:[Zjoi2011]最小割:分治最小割
- HttpApplication处理对象与HttpModule处理模块
- HttpHandler与HttpModule的用处与区别
- http协议特点
- 网络数据包分析
- Linux网络基础知识
- 一个计算机网络的面试题
- 基于Java的tcp实现文本聊天系统
- 网络编程学习——I/O复用(一)
- http://www.y-liang.cn/post-50.html
- 厦门巨游网络科技有限公司(HOTPOWER)承接游戏UI外包
- ubunto apt config proxy 配置代理或者运行在代理网络的环境下
- HTTP协议之状态码
- 【ios开发学习】【swift】Xcode7 使用NSURLSession发送HTTP请求的问题
- 计算机网络-抓包