【Android 】注册广播,实时监听网络连接与断开状态变化
2016-12-06 00:00
676 查看
摘要: 在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件
有的时候我们在写项目的时候,需要监听网络的变化,来做一些事情,需要处理一些业务逻辑等事情。
今天查看了一些帖子资料,写一个demo来记录一下自己的笔记,以便自己在以后使用的时候,能更快的熟悉。
注解:
BroadcastReceiver
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。
下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过滤接收的过程:
首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。
当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。
广播—是一个生命周期很短的过程,在这个过程里面不能有太耗时的操作(当然不能开子线程,有点时候线程还没有结束,广播的生命周期就结束了),那么记录一下自己的demo。
广播的注册方式有两种:
(1)可以在配置文件Manifest.xml中注册
(2)当然还有一种就是在代码中实现动态注册
那么接下来我们就该创建对网络断开和连接实时监听NetworkReceiver继承自BroadcastReceiver,并且要实现其中的一个方法, public void onReceive(Context context, Intent intent)方法。
NetworkReceiver的实现代码如下:
在onReceive方法里面,我们可以获取从广播而来的Intent中的数据,这包含很多有用的信息,其中ConnectivityManager : 主要管理和网络连接相关的操作。WifiManager: 管理和wifi相关的信息
TelephonyManager: 管理和手机、运营商等的相关信息
NetworkInfo类包含了对wifi和mobile两种网络模式连接的详细描述,
通过getState()方法获取的State对象,代表着连接成功与否的状态。
最后记得添加权限:
有的时候我们在写项目的时候,需要监听网络的变化,来做一些事情,需要处理一些业务逻辑等事情。
今天查看了一些帖子资料,写一个demo来记录一下自己的笔记,以便自己在以后使用的时候,能更快的熟悉。
注解:
BroadcastReceiver
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。
下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过滤接收的过程:
首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。
当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。
广播—是一个生命周期很短的过程,在这个过程里面不能有太耗时的操作(当然不能开子线程,有点时候线程还没有结束,广播的生命周期就结束了),那么记录一下自己的demo。
广播的注册方式有两种:
(1)可以在配置文件Manifest.xml中注册
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zhjy.hxf.hznetworkchangedreceiver"> <uses-permission android:name="android.permission.access_wifi_state" /> <uses-permission android:name="android.permission.access_network_state" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!--在AndroidManifest.xml中用标签生命注册,并在标签内用标签设置过滤器--> <receiver android:name=".NetworkReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> <action android:name="android.net.wifi.STATE_CHANGE" /> </intent-filter> </receiver> </application> </manifest>
(2)当然还有一种就是在代码中实现动态注册
package com.zhjy.hxf.hznetworkchangedreceiver; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.wifi.WifiManager; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); init(); } private void init() { //在代码中实现动态注册的方式 IntentFilter filter = new IntentFilter(); filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(new NetworkReceiver(), filter); } }
那么接下来我们就该创建对网络断开和连接实时监听NetworkReceiver继承自BroadcastReceiver,并且要实现其中的一个方法, public void onReceive(Context context, Intent intent)方法。
NetworkReceiver的实现代码如下:
package com.zhjy.hxf.hznetworkchangedreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiManager; import android.os.Parcelable; import android.util.Log; /** * @author :huangxianfeng on 2016/12/6. * 监听网络的变化 */ public class NetworkReceiver extends BroadcastReceiver { private final static String TAG = NetworkReceiver.class.getName(); private String getConnectionType(int type) { String connType = ""; if (type == ConnectivityManager.TYPE_MOBILE) { connType = "3G网络数据"; } else if (type == ConnectivityManager.TYPE_WIFI) { connType = "WIFI网络"; } return connType; } @Override public void onReceive(Context context, Intent intent) { if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())){ //拿到wifi的状态值 int wifiState = intent.getIntExtra(WifiManager.EXTRA_NEW_STATE,0); Log.i(TAG,"wifiState = "+ wifiState); switch (wifiState){ case WifiManager.WIFI_STATE_DISABLED: break; case WifiManager.WIFI_STATE_DISABLING: break; } } //监听wifi的连接状态即是否连接的一个有效的无线路由 if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())){ Parcelable parcelableExtra = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if (parcelableExtra != null){ // 获取联网状态的NetWorkInfo对象 NetworkInfo networkInfo = (NetworkInfo) parcelableExtra; //获取的State对象则代表着连接成功与否等状态 NetworkInfo.State state = networkInfo.getState(); //判断网络是否已经连接 boolean isConnected = state == NetworkInfo.State.CONNECTED; Log.i(TAG, "isConnected:" + isConnected); if (isConnected) { } else { } } } // 监听网络连接,包括wifi和移动数据的打开和关闭,以及连接上可用的连接都会接到监听 if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { //获取联网状态的NetworkInfo对象 NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); if (info != null) { //如果当前的网络连接成功并且网络连接可用 if (NetworkInfo.State.CONNECTED == info.getState() && info.isAvailable()) { if (info.getType() == ConnectivityManager.TYPE_WIFI || info.getType() == ConnectivityManager.TYPE_MOBILE) { Log.i(TAG, getConnectionType(info.getType()) + "连上"); } } else { Log.i(TAG, getConnectionType(info.getType()) + "断开"); } } } } }
在onReceive方法里面,我们可以获取从广播而来的Intent中的数据,这包含很多有用的信息,其中ConnectivityManager : 主要管理和网络连接相关的操作。WifiManager: 管理和wifi相关的信息
TelephonyManager: 管理和手机、运营商等的相关信息
NetworkInfo类包含了对wifi和mobile两种网络模式连接的详细描述,
通过getState()方法获取的State对象,代表着连接成功与否的状态。
最后记得添加权限:
<uses-permission android:name="android.permission.access_wifi_state" /> <uses-permission android:name="android.permission.access_network_state" />
相关文章推荐
- Android 通过注册广播,实时监听网络连接与断开状态的变化
- Android 注册广播,实时监听网络连接与断开状态变化
- android动态注册广播,监听网络状态变化,判断网络模式
- Android动态注册广播,监听网络状态变化,判断网络模式
- Android 实时监测(监听)网络连接状态变化
- Android 实时监测(监听)网络连接状态变化
- Android 实时监测(监听)网络连接状态变化
- Android 实时监测(监听)网络连接状态变化
- Android 实时监测(监听)网络连接状态变化
- Android 实时监测(监听)网络连接状态变化
- android 网络实时监听网络状态变化 及 网络类型判断
- android 实时监听网络连接状态
- 动态注册广播,监听网络状态变化,判断网络模式
- 关于android广播包监听网络状态变化收到java.lang.NullPointerException: Error receiving broadcast Intent
- Android使用广播监听网络状态变化 一直收到系统广播 广播过滤
- Android开发之使用广播监听网络状态变化
- android 使用广播监听网络状态变化
- 笔记 android 监听网络状态变化-------广播
- Android利用广播监听设备网络连接(断网)的变化情况
- Android 利用广播监听usb连接状态(变化情况)