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

27 篇文章 0 订阅

注:本内容部分来自网络

 

需要在Activity中得到网络状态,就是需要在接收到网络状态改变的广播的时候,要能够与Activity进行交互,通知Activity当前的网络状态,这就需要写一个Service,并且绑定到Activity,把广播监听到的实时的网络状态返回给Activity。

Java代码   收藏代码
  1. package com.yooeee.ziyoutong.service;  
  2.   
  3. import java.util.Date;  
  4. import java.util.Timer;  
  5. import java.util.TimerTask;  
  6.   
  7. import android.app.Service;  
  8. import android.content.BroadcastReceiver;  
  9. import android.content.Context;  
  10. import android.content.Intent;  
  11. import android.content.IntentFilter;  
  12. import android.net.ConnectivityManager;  
  13. import android.net.NetworkInfo;  
  14. import android.net.NetworkInfo.State;  
  15. import android.os.Binder;  
  16. import android.os.IBinder;  
  17. import android.util.Log;  
  18.   
  19. public class ReceiveMsgService extends Service  
  20. {// 实时监听网络状态改变  
  21.     private BroadcastReceiver mReceiver = new BroadcastReceiver()  
  22.     {  
  23.         @Override  
  24.         public void onReceive(Context context, Intent intent)  
  25.         {  
  26.             String action = intent.getAction();  
  27.             if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION))  
  28.             {  
  29.                 Timer timer = new Timer();  
  30.                 timer.schedule(new QunXTask(getApplicationContext()), new Date());  
  31.             }  
  32.         }  
  33.     };  
  34.   
  35.     public interface GetConnectState  
  36.     {  
  37.         public void GetState(boolean isConnected); // 网络状态改变之后,通过此接口的实例通知当前网络的状态,此接口在Activity中注入实例对象  
  38.     }  
  39.   
  40.     private GetConnectState onGetConnectState;  
  41.   
  42.     public void setOnGetConnectState(GetConnectState onGetConnectState)  
  43.     {  
  44.         this.onGetConnectState = onGetConnectState;  
  45.     }  
  46.   
  47.     private Binder binder = new MyBinder();  
  48.     private boolean isContected = true;  
  49.   
  50.     @Override  
  51.     public IBinder onBind(Intent intent)  
  52.     {  
  53.         return binder;  
  54.     }  
  55.   
  56.     @Override  
  57.     public void onCreate()  
  58.     {// 注册广播  
  59.         IntentFilter mFilter = new IntentFilter();  
  60.         mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); // 添加接收网络连接状态改变的Action  
  61.         registerReceiver(mReceiver, mFilter);  
  62.     }  
  63.   
  64.     class QunXTask extends TimerTask  
  65.     {  
  66.         private Context context;  
  67.   
  68.         public QunXTask(Context context)  
  69.         {  
  70.             this.context = context;  
  71.         }  
  72.   
  73.         @Override  
  74.         public void run()  
  75.         {  
  76.             if (isNetworkConnected(context) || isWifiConnected(context))  
  77.             {  
  78.                 isContected = true;  
  79.             }  
  80.             else  
  81.             {  
  82.                 isContected = false;  
  83.             }  
  84.             if (onGetConnectState != null)  
  85.             {  
  86.                 onGetConnectState.GetState(isContected); // 通知网络状态改变  
  87.                 Log.i("mylog""通知网络状态改变:" + isContected);  
  88.             }  
  89.         }  
  90.   
  91.         /* 
  92.          * 判断是3G否有网络连接 
  93.          */  
  94.         private boolean isNetworkConnected(Context context)  
  95.         {  
  96.             if (context != null)  
  97.             {  
  98.                 ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);  
  99.                 NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();  
  100.                 if (mNetworkInfo != null)  
  101.                 {  
  102.                     return mNetworkInfo.isAvailable();  
  103.                 }  
  104.             }  
  105.             return false;  
  106.         }  
  107.   
  108.         /* 
  109.          * 判断是否有wifi连接 
  110.          */  
  111.         private boolean isWifiConnected(Context context)  
  112.         {  
  113.             if (context != null)  
  114.             {  
  115.                 ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);  
  116.                 NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);  
  117.                 if (mWiFiNetworkInfo != null)  
  118.                 {  
  119.                     return mWiFiNetworkInfo.isAvailable();  
  120.                 }  
  121.             }  
  122.             return false;  
  123.         }  
  124.     }  
  125.   
  126.     public class MyBinder extends Binder  
  127.     {  
  128.         public ReceiveMsgService getService()  
  129.         {  
  130.             return ReceiveMsgService.this;  
  131.         }  
  132.     }  
  133.   
  134.     @Override  
  135.     public void onDestroy()  
  136.     {  
  137.         super.onDestroy();  
  138.         unregisterReceiver(mReceiver); // 删除广播  
  139.     }  
  140. }  
Java代码   收藏代码
  1.    

接下来在Activity中,绑定服务

Java代码   收藏代码
  1. public class MainActivity extends Activity  {  
  2.   
  3.     protected String TAG = "mylog";  
  4.     ReceiveMsgService receiveMsgService;  
  5.     private boolean conncetState = true// 记录当前连接状态,因为广播会接收所有的网络状态改变wifi/3g等等,所以需要一个标志记录当前状态  
  6.   
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         // TODO Auto-generated method stub  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.page_main);  
  12.                   
  13.         bind();  
  14.   
  15.   
  16.     }  
  17.   
  18.     private void bind() {  
  19.         Intent intent = new Intent(MainActivity.this, ReceiveMsgService.class);  
  20.         bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);  
  21.     }  
  22.   
  23.     private ServiceConnection serviceConnection = new ServiceConnection() {  
  24.         @Override  
  25.         public void onServiceDisconnected(ComponentName name) {  
  26.         }  
  27.   
  28.         @Override  
  29.         public void onServiceConnected(ComponentName name, IBinder service) {  
  30.             receiveMsgService = ((ReceiveMsgService.MyBinder) service)  
  31.                     .getService();  
  32.             receiveMsgService.setOnGetConnectState(new GetConnectState() { // 添加接口实例获取连接状态  
  33.                         @Override  
  34.                         public void GetState(boolean isConnected) {  
  35.                             if (conncetState != isConnected) { // 如果当前连接状态与广播服务返回的状态不同才进行通知显示  
  36.                                 conncetState = isConnected;  
  37.                                 if (conncetState) {// 已连接  
  38.                                     handler.sendEmptyMessage(1);  
  39.                                 } else {// 未连接  
  40.                                     handler.sendEmptyMessage(2);  
  41.                                 }  
  42.                             }  
  43.                         }  
  44.                     });  
  45.         }  
  46.     };  
  47.       
  48.     private void unbind() {  
  49.         if (receiveMsgService != null ) {  
  50.             unbindService(serviceConnection);  
  51.             Log.i("mylog""执行unbind()");  
  52.         }  
  53.     }  
  54.   
  55.     Handler handler = new Handler() {  
  56.         public void handleMessage(Message msg) {  
  57.   
  58.             switch (msg.what) {  
  59.             case 1:// 已连接  
  60.                 Toast.makeText(MainActivity.this"网络已经连接" ,Toast.LENGTH_LONG).show();  
  61.                 break;  
  62.             case 2:// 未连接  
  63.                 Toast.makeText(MainActivity.this"网络未连接" ,Toast.LENGTH_LONG).show();  
  64.                 break;  
  65.             default:  
  66.                 break;  
  67.             }  
  68.             ;  
  69.         };  
  70.   
  71.     };  
  72.       
  73.     @Override  
  74.     protected void onDestroy()  
  75.     {  
  76.         // TODO Auto-generated method stub  
  77.         super.onDestroy();  
  78.         unbind();  
  79.     }  
  80.       
  81.       
  82. }  

 

 

当然也可以直接在Activity中注册一个广播,在接收到广播之后进行判断,这种情况就稍简单些,Activity可以直接访问到广播中的一些变量;最后,需要添加一些权限:

Xml代码   收藏代码
  1. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />      
  2. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  

 

 单纯用广播来监控网络状态,前提是不需要与Activity通信

Java代码   收藏代码
  1. private ConnectivityManager connectivityManager;  
  2.      
  3. private NetworkInfo info;  
  4.   
  5.         @Override  
  6.     public void onReceive(Context context, Intent intent) {  
  7.         // TODO Auto-generated method stub  
  8.         String action = intent.getAction();  
  9.         if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {  
  10.             Log.d("mylog""网络状态已经改变");  
  11.             connectivityManager = (ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE);  
  12.             info = connectivityManager.getActiveNetworkInfo();    
  13.             if(info != null && info.isAvailable()) {  
  14.                 String name = info.getTypeName();  
  15.                 Log.d("mylog""当前网络名称:" + name);  
  16.             } else {  
  17.                 Log.d("mylog""没有可用网络");  
  18.             }  
  19.         }  
  20.           
  21.     }  

 

如果分别需要得到3G和WIFI连接方式如下:

 

Java代码   收藏代码
  1. ConnectivityManager connectMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);  
  2.   
  3. //3G          
  4. NetworkInfo mobNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);  
  5. //WIFI  
  6. NetworkInfo wifiNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);  

 

最后别忘了在XML中注册广播,当然也可以在代码中注册广播。

 

Xml代码   收藏代码
  1. <receiver  
  2.             android:name="com.yooeee.freepass.service.NetworkReceiver"  
  3.             android:label="NetworkConnection" >  
  4.             <intent-filter>  
  5.                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />  
  6.                 <action android:name="android.intent.action.USER_PRESENT" />  
  7.             </intent-filter>  
  8.         </receiver>  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值