接受广播消息
2015-02-17 09:33
127 查看
《疯狂Android》一书学习笔记:
创建要启动的BroadcastReceiver的Intent;
调用Context基类的sendBroadcast()或sendOrderedBroadcast()方法来启动。
指定一个BroadcastReceiver能接受的Intent有两种做法:
一、使用代码:Context类的registerReceiver(BroadcastReceiver receiver, IntentFilter filter),实例代码:
和Activity启动的区别,如果启动Intent没有找到对应Activity会抛出异常,但是如果是通过Intent激发BroadcastReceiver时没有找到对应的组件不会有任何问题。
另外值得注意的是,不要用BroadcastReceiver执行耗时操作,因为onReceive方法如果超过10秒没有回应就会抛出ANR异常,也不要启动新的子线程去执行,因为BroadcastReceiver的生命周期很短,可能子线程还没有执行完,BroadcastReceiver就被摧毁了。推荐的做法还是使用Service来完成。
给出示例代码,点击按钮发送广播:
接受它的BroadcastReceiver代码如下:
最后给出配置文件AndroidManifest.xml中对BroadcastReceiver的配置:
有序广播
广播被分为普通和有序两种:
Normal Broadcast: 同一时刻所有接受者都可以接收到,消息传递效率高。无法依次传播,无法停止;sendBroadcast()。
Ordered Broadcast: 根据接受者的优先级依次传递,并且可以停止; sendOrderedBroadcast()。
Ordered Broadcast 接受者还可以处理intent数据然后再传给其他接受者。通过setResultExtras(Bundle)方法将处理结果存入Broadcast,然后下任接受者通过getResultExtras(true)接受数据。
下面给出一个有序广播的示例代码,一个Activity通过调用sendOrderedBroadcast来发送有序广播,两个接受者的优先级不同第一个接受者收到消息后加入了新的数据,传递给了第二个接受者,两个接受者的代码如下:
第二个Receiver:
两个接受者的Manifest配置:
接受广播消息
四大组建的一种,接受广播消息BroadcastReceiver,是一种全局的监听器。BroadcastReceiver简介
BroadcastReceiver用于接听Broadcast Intent,与启动Activity或Service类似,启动BroadcastReceiver也需要两部:创建要启动的BroadcastReceiver的Intent;
调用Context基类的sendBroadcast()或sendOrderedBroadcast()方法来启动。
指定一个BroadcastReceiver能接受的Intent有两种做法:
一、使用代码:Context类的registerReceiver(BroadcastReceiver receiver, IntentFilter filter),实例代码:
IncomingSMSReceiver receiver = new IncomingSMSReceiver(); IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); registerReceiver(receiver,filter);二、在AndroidManifest.xml里配置:实例代码:
<receiver android:name=".IncomingSMSReceiver"> <intent-filter> <action android:nam="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>当onReceive事件执行完后,BroadcastReceiver的实例就会自动被系统销毁。
和Activity启动的区别,如果启动Intent没有找到对应Activity会抛出异常,但是如果是通过Intent激发BroadcastReceiver时没有找到对应的组件不会有任何问题。
另外值得注意的是,不要用BroadcastReceiver执行耗时操作,因为onReceive方法如果超过10秒没有回应就会抛出ANR异常,也不要启动新的子线程去执行,因为BroadcastReceiver的生命周期很短,可能子线程还没有执行完,BroadcastReceiver就被摧毁了。推荐的做法还是使用Service来完成。
发送广播
发送广播只需要调用Context的sendBroadcast(Intent intent)方法即可。给出示例代码,点击按钮发送广播:
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class BroadcastMain extends Activity { Button send; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取程序界面中的按钮 send = (Button) findViewById(R.id.send); send.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 创建Intent对象 Intent intent = new Intent(); // 设置Intent的Action属性 intent.setAction("org.crazyit.action.CRAZY_BROADCAST"); intent.putExtra("msg", "简单的消息"); // 发送广播 sendBroadcast(intent); } }); } }
接受它的BroadcastReceiver代码如下:
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到的Intent的Action为:" + intent.getAction() + "\n消息内容是:" + intent.getStringExtra("msg") , Toast.LENGTH_LONG).show(); } }
最后给出配置文件AndroidManifest.xml中对BroadcastReceiver的配置:
<receiver android:name=".MyReceiver"> <intent-filter> <action android:name="org.crazyit.action.CRAZY_BROADCAST" /> </intent-filter> </receiver>
有序广播
广播被分为普通和有序两种:
Normal Broadcast: 同一时刻所有接受者都可以接收到,消息传递效率高。无法依次传播,无法停止;sendBroadcast()。
Ordered Broadcast: 根据接受者的优先级依次传递,并且可以停止; sendOrderedBroadcast()。
Ordered Broadcast 接受者还可以处理intent数据然后再传给其他接受者。通过setResultExtras(Bundle)方法将处理结果存入Broadcast,然后下任接受者通过getResultExtras(true)接受数据。
下面给出一个有序广播的示例代码,一个Activity通过调用sendOrderedBroadcast来发送有序广播,两个接受者的优先级不同第一个接受者收到消息后加入了新的数据,传递给了第二个接受者,两个接受者的代码如下:
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到的Intent的Action为:" + intent.getAction() + "\n消息内容是:" + intent.getStringExtra("msg") , Toast.LENGTH_LONG).show(); // 创建一个Bundle对象,并存入数据 Bundle bundle = new Bundle(); bundle.putString("first", "第一个BroadcastReceiver存入的消息"); // 将bundle放入结果中 setResultExtras(bundle); // 取消Broadcast的继续传播 // abortBroadcast(); //① } }
第二个Receiver:
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; public class MyReceiver2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = getResultExtras(true); // 解析前一个BroadcastReceiver所存入的key为first的消息 String first = bundle.getString("first"); Toast.makeText(context, "第一个Broadcast存入的消息为:" + first, Toast.LENGTH_LONG).show(); } }
两个接受者的Manifest配置:
<receiver android:name=".MyReceiver"> <intent-filter android:priority="20"> <action android:name="org.crazyit.action.CRAZY_BROADCAST" /> </intent-filter> </receiver> <receiver android:name=".MyReceiver2"> <intent-filter android:priority="0"> <action android:name="org.crazyit.action.CRAZY_BROADCAST" /> </intent-filter> </receiver>
相关文章推荐
- iOS之WebSocket(即时通讯、实时接受广播消息)
- android 接受消息广播,简单的自定义notification样式弹出
- 接受系统广播消息 BroadcastReceiver
- 消息广播接受
- 机器人开机以后局域网不断广播消息 另一台电脑接受消息 python UDP 不间断广播
- weblogic中使用jms发送和接受消息
- 编写一段Socket服务端程序,监听端口8888,接受到Client的消息“nihao”后,将“nihao”写回到客户端,关闭socket。
- 示例C#利用UdpClient发送广播消息
- Android 中的消息传递-广播机制
- SpringBoot webSocket 发送广播、点对点消息,Android接收
- iOS 服务器对接友盟消息推送生产环境推送失败(客户端接受不到推送消息)
- 没有终结点在侦听可以接受消息的 U9WorkflowService
- windows/mfc 隐藏窗口接受消息的问题
- Android消息广播的使用
- Android 4.0 消息广播无法接收的原因
- android 限制广播消息的接收者
- 微信公众号消息接受与回复
- Delphi使用TObject类对象创建接受window消息(使用Classes.AllocateHWnd为对象创建一个尺寸为0的窗口,从而有了Handle)good
- 用IOT的思维来管理我们的查看我们重要业务的服务器健康状态-接受消息脚本编写!
- Linux系统下UDP发送和接收广播消息小例子