本文主要用到了安卓监测网络状态变化功能,实现了WIFI,3G,无网络状态切换时发出通知的功能。

主要知识点

  1. service
  2. broadcast
  3. 接口回调实现

service的基本知识

service可分为

  • 按运行地点分类

    • 本地服务
    • 远程服务
  • 按按运行类型分类:

    • 前台服务
    • 后台服务
  • 按使用方式分类:

    • startService 启动的服务
    • bindService 启动的服务
    • startService 同时也 bindService 启动的服务

service生命周期

详情请见参考链接:

Android 中的 Service 全面总结 - - 博客频道 - CSDN.NET

Android开发之如何保证Service不被杀掉(broadcast+system/app) - 其实并不难,是你太悲观 - 博客频道 - CSDN.NET

安卓监测网络状态变化

service部分

package com.zj.servicewifi;

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.os.Binder;
import android.os.IBinder;
import android.provider.SyncStateContract.Constants;
import android.util.Log; public class WIFIService extends Service{
int IntentId;
int NOINTENT=0;
int WIFI=1;
int GRS=2; // 实时监听网络状态改变
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(int 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 (is3GConnected(context)&&isWifiConnected(context)==false)
{
System.out.println("hereere*************");
IntentId= 2;
}
else if(isWifiConnected(context))
{
IntentId=WIFI;
}
else
{
IntentId=NOINTENT;
} if (onGetConnectState != null)
{
onGetConnectState.GetState(IntentId); // 通知网络状态改变
Log.i("mylog", "通知网络状态改变:" + IntentId);
}
} /*
* 判断是3G否有网络连接
*/
private boolean is3GConnected(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 WIFIService getService()
{
return WIFIService.this;
}
} @Override
public void onDestroy()
{
super.onDestroy();
unregisterReceiver(mReceiver); // 删除广播
} }

注意,其中用到广播接收者,广播接收者有两种注册方式,在代码中注册与在XML文件中注册,本例中在代码中注册了,如果再在XML中注册,会报错

activity中代码

package com.zj.servicewifi;

import com.zj.servicewifi.WIFIService.GetConnectState;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast; public class MainActivity extends Activity { protected String TAG = "mylog";
WIFIService receiveMsgService;
int IntentID=0;
ServiceConnection sc;
boolean state;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); sc=new ServiceConnection() { @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub } @Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub receiveMsgService = ((WIFIService.MyBinder) service)
.getService();
receiveMsgService.setOnGetConnectState(new GetConnectState() { // 添加接口实例获取连接状态
@Override
public void GetState(int id) {
if (IntentID != id) { // 如果当前连接状态与广播服务返回的状态不同才进行通知显示
IntentID = id;
if (IntentID==0) {// 已连接
handler.sendEmptyMessage(0);
} else if(IntentID==1){// 未连接
handler.sendEmptyMessage(1);
} else if(IntentID==2)
{
handler.sendEmptyMessage(2);
}
}
}
}); }
};
} public void bind(View view)
{
startService(new Intent(MainActivity.this,WIFIService.class));
bindService(new Intent(MainActivity.this, WIFIService.class), sc, getApplicationContext().BIND_AUTO_CREATE);
state = true; }
public void unbind(View view)
{
if(state ){ unbindService(sc);
state = false;
} }
public void start(View view)
{ }
public void stop(View view)
{ }
@Override
protected void onDestroy()
{
// TODO Auto-generated method stub
super.onDestroy();
if(state){
unbindService(sc);
state = false;
}
} Handler handler = new Handler() {
public void handleMessage(Message msg) { switch (msg.what) {
case 0:
Toast.makeText(MainActivity.this, "网络未经连接" ,Toast.LENGTH_LONG).show();
break;
case 1:// 已连接
Toast.makeText(MainActivity.this, "WIFI已经连接" ,Toast.LENGTH_LONG).show();
break;
case 2:// 未连接
Toast.makeText(MainActivity.this, "3G已连接" ,Toast.LENGTH_LONG).show();
break;
default:
break;
}
;
}; }; }

本例中最重要的一点就是在service中定义了一个接口,在activity中实例化,则在service中调用方法的时候,会调用在activity中实例化的方法,不知道这是什么设计模式,只觉得很神奇。

参考链接:

android 通过Service和Receiver来监听网络状态 - - ITeye技术网站

Android判断设备网络连接状态,并判断连接方式 - lzan13的专栏 - 博客频道 - CSDN.NET

完成

Android实现监测网络状态的更多相关文章

  1. Android实例-监测网络状态及一些事件(XE8+小米2)

    结果: 1.网络连接:是指现在可不可以上网(你非要问我什么是网,我会K你呀的). 2.WIFI网络:是指现在可以上网,用的是不是WIFI网络(如果你打开了WIFI那它会显示正在使用WIFI). 3.移 ...

  2. iOS开发网络篇—监测网络状态(转)

    文章转载自:http://www.cnblogs.com/wendingding/p/3950114.html iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时 ...

  3. iOS开发网络篇—监测网络状态

    iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行 ...

  4. OS开发网络篇—监测网络状态

    iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行 ...

  5. iOS开发之监测网络状态

    一.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行智能处理,节省用户流量,提高用户 ...

  6. Android 监控网络状态

    public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivity = (Conn ...

  7. Android 锁屏状态/锁屏密码等相关

    Android 锁屏状态/锁屏密码等相关 开始是在设备管理器方面找方法,但一直不行,可能在公司系统组同事的帮助下,知道KeyguardManager这个类 /** * 当前系统锁屏是否有密码 * @p ...

  8. Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)

    原文:[置顶] Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上) 我们在用手机的时候可能会发现,即使应用被放到后台再返回到前台数据依然保留(比如说我们正在玩游戏,突然电话 ...

  9. Android菜鸟的成长笔记(15)—— Android中的状态保存探究(下)

    原文:Android菜鸟的成长笔记(15)-- Android中的状态保存探究(下) 在上一篇中我们简单了解关于Android中状态保存的过程和原理,这一篇中我们来看一下在系统配置改变的情况下保存数据 ...

随机推荐

  1. [前端]前端面试题第二波~[http/tcp/网络篇]

    目录: Cookie 是否会被覆盖,localStorage是否会被覆盖? 如何保持登陆状态? Ajax原生 Jsonp的原理.怎么去读取一个script里面的数据. 如果页面初始载入的时候把ajax ...

  2. hashcode与字符串

    问题1. 不同的字符串可能会有相同的HashCode吗? hashcode是用来判断两个字符串是否相等的依据,不同的字符串不可能有相同的hashcode,但不同的hashCode经过与长度的取余,就很 ...

  3. 如何使用网盘托管git项目

    话说近年来git已经成为项目源代码管理的标准工具,有不少免费托管网站可供使用,详情参考这篇文章: http://www.cnblogs.com/zdz8207/archive/2012/05/20/2 ...

  4. Jenkins 搭建U3D自动发布 IOS

    http://www.cnblogs.com/yinghuochong/archive/2013/09/01/3294940.html 1.安装包,工具略过. 2.插件管理 Subversion Pl ...

  5. Unity 游戏资源ktx转换png

    Unity 开发的模型贴图都是.ktx格式的,提取出来的资源,其中的ktx资源,用PVRTexToolGUI.exe可以打开查看,可以发现都是上下颠倒,且被拉伸 直接转为png格式的批处理脚本为: @ ...

  6. ps 倒影制作

    首先打开PS并打开一张素材,这里我选择了山水图片,制作山峰在水中的倒影效果.   然后按下[Crrl+J]复制这个图层,如图:   接着按下[Ctrl+T]或者是[编辑][自由变换],打开[自由变换] ...

  7. ssh框架整合完整版

    1.导入jar包 可以在src下添加一个log4j.properties文件来记录日志 2.加入实体类+映射文件 映射:从类入手class+属性 a.映射的头文件在:hibernate3.jar--& ...

  8. cnblog可以直接黏贴qq截图,但最好不要偷懒

    秋秋(qq)基本上算是ytkah本人开机后要开的软件了,平时也习惯用Ctrl+Alt+A快捷键来进行截图.很早以前ytkah一个无意间发现cnblog可以直接黏贴qq截图,当时截图后可能是忘记黏贴到其 ...

  9. zstu.4194: 字符串匹配(kmp入门题&& 心得)

    4194: 字符串匹配 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 206  Solved: 78 Description 给你两个字符串A,B,请 ...

  10. Loadrunner日志设置与查看

    1.打开EXtended Log Log告诉了我们一切,默认的Log是standard Log,这时远远不够的.我们要extended log,打开路径为runtime settings-->l ...