您的位置:首页 > 理论基础 > 计算机网络

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>  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: