Android中BroadcastReceiver(异步接收广播Intent)的使用
程序员文章站
2023-12-04 11:08:10
broadcast receiver简介 broadcast receiver是android的五大组件之一,使用频率也很高。 用于异步接收广播intent,广播inten...
broadcast receiver简介
broadcast receiver是android的五大组件之一,使用频率也很高。
用于异步接收广播intent,广播intent的发送是通过调用context.sendbroadcast()、广播接收者(broadcastreceiver)用于异步接收广播intent,广播intent的发送是通过调用context.sendbroadcast()、context.sendorderedbroadcast()或者context.sendstickybroadcast()来实现的。通常一个广播intent可以被订阅了此intent的多个广播接收者所接收,广播接收者和jms中的topic消息接收者很相似.
广播接收器只能接收广播,对广播的通知做出反应,很多广播都产生于系统代码.如:时区改变的通知,电池电量不足、用户改变了语言偏好或者开机启动等.
广播接收器没有用户界面,但是,它可以为它们接收到信息启动一个activity或者使用notificationmanager来通知用户.
生命周期
一个broadcastreceiver 对象只有在被调用onreceive(context, intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。
因此从这个特征可以看出,在所调用的onreceive(context, intent)函数里,不能有过于耗时的操作,不能使用线程来执行。对于耗时的操作,请start service来完成。因为当得到其他异步操作所返回的结果时,broadcastreceiver 可能已经无效了。
监听网络状态变化的例子
下面通过一个例子来使用broadcastreceiver。
networkstatereceiver:接收网络状态变化时系统发出的broadcast。
package com.example.networkbroadcastreceiver;
import android.content.broadcastreceiver;
import android.content.context;
import android.content.intent;
import android.net.connectivitymanager;
import android.net.networkinfo;
import android.util.log;
import android.widget.toast;
public class networkstatereceiver extends broadcastreceiver {
private static final string tag = "networkstatereceiver";
@override
public void onreceive(context context, intent intent) {
log.i(tag, "network state changed.");
if (!isnetworkavailable(context)) {
toast.maketext(context, "network disconnected!", 0).show();
}
else toast.maketext(context, "network connected!", 0).show();
}
/**
* 网络是否可用
*
* @param context
* @return
*/
public static boolean isnetworkavailable(context context) {
connectivitymanager mgr = (connectivitymanager) context.getsystemservice(context.connectivity_service);
networkinfo[] info = mgr.getallnetworkinfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getstate() == networkinfo.state.connected) {
return true;
}
}
}
return false;
}
}
mainactivity:
package com.example.networkbroadcastreceiver;
import android.os.bundle;
import android.app.activity;
import android.view.menu;
public class mainactivity extends activity {
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
静态注册和动态注册
写好broadcastreceiver 之后要对其进行注册。
静态注册需要修改manifest文件,也是我采用的方法。
添加
<span style="font-size: 14px"><receiver android:name=".networkstatereceiver" >
<intent-filter>
<action android:name="android.net.conn.connectivity_change" />
<category android:name="android.intent.category.default" />
</intent-filter>
</receiver></span>
动态注册的话需要这样做(未调试):
1. 在activity的oncreate中:
//注册网络监听
intentfilter filter = new intentfilter();
filter.addaction(connectivitymanager.connectivity_action);
registerreceiver(mnetworkstatereceiver, filter);
2. 在activity中的ondestroy中:
//取消监听
unregisterreceiver(mnetworkstatereceiver);
最终效果:
broadcast receiver是android的五大组件之一,使用频率也很高。
用于异步接收广播intent,广播intent的发送是通过调用context.sendbroadcast()、广播接收者(broadcastreceiver)用于异步接收广播intent,广播intent的发送是通过调用context.sendbroadcast()、context.sendorderedbroadcast()或者context.sendstickybroadcast()来实现的。通常一个广播intent可以被订阅了此intent的多个广播接收者所接收,广播接收者和jms中的topic消息接收者很相似.
广播接收器只能接收广播,对广播的通知做出反应,很多广播都产生于系统代码.如:时区改变的通知,电池电量不足、用户改变了语言偏好或者开机启动等.
广播接收器没有用户界面,但是,它可以为它们接收到信息启动一个activity或者使用notificationmanager来通知用户.
生命周期
一个broadcastreceiver 对象只有在被调用onreceive(context, intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。
因此从这个特征可以看出,在所调用的onreceive(context, intent)函数里,不能有过于耗时的操作,不能使用线程来执行。对于耗时的操作,请start service来完成。因为当得到其他异步操作所返回的结果时,broadcastreceiver 可能已经无效了。
监听网络状态变化的例子
下面通过一个例子来使用broadcastreceiver。
networkstatereceiver:接收网络状态变化时系统发出的broadcast。
复制代码 代码如下:
package com.example.networkbroadcastreceiver;
import android.content.broadcastreceiver;
import android.content.context;
import android.content.intent;
import android.net.connectivitymanager;
import android.net.networkinfo;
import android.util.log;
import android.widget.toast;
public class networkstatereceiver extends broadcastreceiver {
private static final string tag = "networkstatereceiver";
@override
public void onreceive(context context, intent intent) {
log.i(tag, "network state changed.");
if (!isnetworkavailable(context)) {
toast.maketext(context, "network disconnected!", 0).show();
}
else toast.maketext(context, "network connected!", 0).show();
}
/**
* 网络是否可用
*
* @param context
* @return
*/
public static boolean isnetworkavailable(context context) {
connectivitymanager mgr = (connectivitymanager) context.getsystemservice(context.connectivity_service);
networkinfo[] info = mgr.getallnetworkinfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getstate() == networkinfo.state.connected) {
return true;
}
}
}
return false;
}
}
mainactivity:
复制代码 代码如下:
package com.example.networkbroadcastreceiver;
import android.os.bundle;
import android.app.activity;
import android.view.menu;
public class mainactivity extends activity {
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
静态注册和动态注册
写好broadcastreceiver 之后要对其进行注册。
静态注册需要修改manifest文件,也是我采用的方法。
添加
复制代码 代码如下:
<span style="font-size: 14px"><receiver android:name=".networkstatereceiver" >
<intent-filter>
<action android:name="android.net.conn.connectivity_change" />
<category android:name="android.intent.category.default" />
</intent-filter>
</receiver></span>
动态注册的话需要这样做(未调试):
1. 在activity的oncreate中:
//注册网络监听
intentfilter filter = new intentfilter();
filter.addaction(connectivitymanager.connectivity_action);
registerreceiver(mnetworkstatereceiver, filter);
2. 在activity中的ondestroy中:
//取消监听
unregisterreceiver(mnetworkstatereceiver);
最终效果:
推荐阅读
-
Android中BroadcastReceiver(异步接收广播Intent)的使用
-
Android中实现异步任务机制的AsyncTask方式的使用讲解
-
Android BroadcastReceiver 接收收到短信的广播
-
在使用信鸽推送时,自定义接收器发送广播,在自定义application中处理广播时重复处理的
-
Android开发——BroadcastReceiver广播的使用
-
Android BroadcastReceiver 接收收到短信的广播
-
Android 之 系统广播机制BroadcastReceiver的使用
-
Android中实现异步任务机制的AsyncTask方式的使用讲解
-
Android中的广播和广播接收器代码实例
-
Android开发——BroadcastReceiver广播的使用