
很多时候我们都需要实时监听网络状态,当网络状态发生变化之后立即通知程序进行不同的 *** 作。
监听广播的两种方式:
(1)在AndroidManifestxml配置文件中声明
<receiver android:name="NetworkConnectChangedReceiver" >
<intent-filter>
<action android:name="androidnetconnCONNECTIVITY_CHANGE" />
<action android:name="androidnetwifiWIFI_STATE_CHANGED" />
<action android:name="androidnetwifiSTATE_CHANGE" />
</intent-filter>
</receiver>1234567
(2)在代码中注册
IntentFilter filter = new IntentFilter(); filteraddAction(WifiManagerWIFI_STATE_CHANGED_ACTION); filteraddAction(WifiManagerNETWORK_STATE_CHANGED_ACTION); filteraddAction(ConnectivityManagerCONNECTIVITY_ACTION);
registerReceiver(new NetworkConnectChangedReceiver(), filter);12345
接下来创建实时监听网络连接与断开状态变化的BroadcastReceiver对象,我们需要继承androidcontentBroadcastReceiver,并实现其onReceive方法,下面我们就创建一个名为NetworkConnectChangedReceiver广播接收者,看一下具体的实现代码,由于代码写得很详细,就不一一解释了
package compernetworkconnectdome;import androidcontentBroadcastReceiver;import androidcontentContext;import androidcontentIntent;import androidnetConnectivityManager;import androidnetNetworkInfo;import androidnetwifiWifiManager;import androidosParcelable;import androidutilLog;public class NetworkConnectChangedReceiver extends BroadcastReceiver {
private String getConnectionType(int type) {
String connType = ""; if (type == ConnectivityManagerTYPE_MOBILE) {
connType = "3G网络数据";
} else if (type == ConnectivityManagerTYPE_WIFI) {
connType = "WIFI网络";
} return connType;
} @Override
public void onReceive(Context context, Intent intent) { if (WifiManagerWIFI_STATE_CHANGED_ACTIONequals(intentgetAction())) {// 监听wifi的打开与关闭,与wifi的连接无关
int wifiState = intentgetIntExtra(WifiManagerEXTRA_WIFI_STATE, 0);
Loge("TAG", "wifiState:" + wifiState); switch (wifiState) { case WifiManagerWIFI_STATE_DISABLED: break; case WifiManagerWIFI_STATE_DISABLING: break;
}
} // 监听wifi的连接状态即是否连上了一个有效无线路由
if (WifiManagerNETWORK_STATE_CHANGED_ACTIONequals(intentgetAction())) {
Parcelable parcelableExtra = intent
getParcelableExtra(WifiManagerEXTRA_NETWORK_INFO); if (null != parcelableExtra) { // 获取联网状态的NetWorkInfo对象
NetworkInfo networkInfo = (NetworkInfo) parcelableExtra; //获取的State对象则代表着连接成功与否等状态
NetworkInfoState state = networkInfogetState(); //判断网络是否已经连接
boolean isConnected = state == NetworkInfoStateCONNECTED;
Loge("TAG", "isConnected:" + isConnected); if (isConnected) {
} else {
}
}
} // 监听网络连接,包括wifi和移动数据的打开和关闭,以及连接上可用的连接都会接到监听
if (ConnectivityManagerCONNECTIVITY_ACTIONequals(intentgetAction())) { //获取联网状态的NetworkInfo对象
NetworkInfo info = intent
getParcelableExtra(ConnectivityManagerEXTRA_NETWORK_INFO); if (info != null) { //如果当前的网络连接成功并且网络连接可用
if (NetworkInfoStateCONNECTED == infogetState() && infoisAvailable()) { if (infogetType() == ConnectivityManagerTYPE_WIFI
|| infogetType() == ConnectivityManagerTYPE_MOBILE) {
Logi("TAG", getConnectionType(infogetType()) + "连上");
}
} else {
Logi("TAG", getConnectionType(infogetType()) + "断开");
}
}
}
}
}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
在onReceive方法里面,我们可以获取从广播而来的Intent中的数据,这包含很多有用的信息,其中
ConnectivityManager : 主要管理和网络连接相关的 *** 作
WifiManager: 管理和wifi相关的信息
TelephonyManager: 管理和手机、运营商等的相关信息
NetworkInfo类包含了对wifi和mobile两种网络模式连接的详细描述,通过getState()方法获取的State对象,代表着连接成功与否的状态。
最后记得添加权限:
<uses-permission android:name="androidpermissionaccess_wifi_state" /><uses-permission android:name="androidpermissionaccess_network_state" />
通常情况下我们习惯于用动态的broadcastReceiver ,不用的时候就销毁,比较节省系统资源。但是需要接收IntentACTION_BOOT_COMPLETED 这样开启完成的广播的时候,必须用静态的广播。
安卓广播接收器Intent,它有提供过滤器功能,也就是开发者定义过滤条件,只有是这个条件的广播才接收,这样就可以接收指定广播。这也是安卓广播的基础知识功能,具体自己查阅相关资料,很简单的。
BroadcastReceiver(广播接收器)是Android四大组件之一,顾名思义,通过广播的方式进行消息传递,其本质是一个全局的监听器,可以监听到各种广播,可以用来实现不同组件之间的通信。广播最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的,通过这样的形式来达到接、收双方的完全解耦合。
又称无序广播,这种广播完全是异步的,所有与广播Intent匹配的BroadcastReceiver,都可以收到这条广播,并且不分先后顺序,视为同时收到,通过ContextsendBroadcast()方法发送。这种广播的效率比较高,但缺点是接收器不能将处理结果传递给下一个接收器,并且无法在中途终止广播。
这是一种同步执行的广播,通过ContextsendOrderedBroadcast()方法发送,这种广播发出后,通过receiver的intent-filter中的android:priority属性来设置优先级,优先级从-1000~1000,数越大,优先级越高,使用setResult()方法把结果传递给下一个接收者,通过getResult()方法获取上一个接收者传递过来的结果,并可以通过abortBroadcast()方法丢弃该广播,使该广播不再传递给下一个接收者。
粘性广播通过ContextsendStickBroadcast()方法来发送,用此方法发送的广播会一直滞留,当有匹配此广播的接收器被注册后,该广播接收器就会收到此广播。使用此广播时,需要获得BROADCAST_STICKY权限。(在 android 50/api 21后不再推荐使用)
Android系统中内置了多个系统广播,只要涉及到手机的基本 *** 作,基本上都会发出相应的系统广播。如:开启启动,网络状态改变,拍照,屏幕关闭与开启,点亮不足等等。每个系统广播都具有特定的intent-filter,其中主要包括具体的action,系统广播发出后,将被相应的BroadcastReceiver接收。系统广播在系统内部当特定事件发生时,有系统自动发出。
以上广播都属于全局广播,发出去的广播,只要有匹配的接收者,就可以收到广播。这样一来会造成一些问题,一是消耗性能,二是容易引起安全性的问题,为了能够简单的解决这方面的问题,Android引入了一套广播本地广播机制,使用该机制发出的广播只能够在本应用内部进行传递,并且广播接收器也只能接收来自本应用发出的广播。
使用方法
1注册本地广播接收器
2发送本地广播
3注销本地广播接收器
本文用到的BroadcastReceiver
Android 80(API级别26)取消大部分静态注册广播,建议使用动态广播
>
注册方式有两种:
1、静态注册,就是在manifest文件里配置一下,这种方式注册的广播属于系统级广播。你的应用没打开也能收到广播。比如你要做一个收到某广播就启动你的应用的功能可以这样搞。
2、动态注册,在代码里执行一个rigisterBroadcastReciver(可能拼写有误)的方法。这种你要自己作好反注册。这种广播可以做成你的应用启动后才监听,关闭后就不监听的效果。
以上就是关于android wifi正在连接的状态广播全部的内容,包括:android wifi正在连接的状态广播、请问android中静态注册的广播接收器怎么截取广播、安卓广播接收器怎么判断是哪个应用发送的想要只接收自身应用广播,怎么实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)