【转】 Pro Android学习笔记(九七):BroadcastReceiver(1):基础小例子
2015-12-15 13:58
603 查看
目录(?)[-]
基础小例子
发送Broadcast intent
运行情况
应用间的广播
文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/
和activity、content provider以及service一样,BraodcastReceiver是Android的组件。广播接收器接收广播消息,并进行相应地处理。广播消息就是Android的broadcast intent。一个broadcast intent可以触发多个接收器。
//为了保证action的唯一性,通常采用包名的namespace。
String actionString = "cn.flowingflying.proandroid.testbrocastreceiver.intent.testbc";
Intent bcIntent = new Intent(actionString);
bcIntent.putExtra("message", "No " + (count ++));
Log.v("Main","Before send");
//组件(acivity或者service)使用sendBrocast()进行发送广播消息,参数则是intent。
sendBroadcast(bcIntent);
Log.v("Main","After send");
}
Broadcast接收器
接收器实现很简单,继承BroadcastReceiver,同时要在manifest文件中通过<receiver>的tag来注册要监听的广播intent,我们也可以在运行时在代码中进行注册。
public class TestReceiver extends BroadcastReceiver{
private String tag = "TestReceiver";
@Override //收到广播的回调函数
public void onReceive(Context context, Intent intent) {
Utils.logThreadSignature(tag); //显示Thread的信息
Log.v(tag,"context = " + context);
Log.v(tag,"this = " + this);
Log.v(tag,"intent = " + intent);
String message = intent.getStringExtra("message");
Log.v(tag,"message : " + message);
}
}
需要通过AndroidManifest.xml告诉系统需要接受broadcast消息。<receiver>和其他组件一样是<application>的node。
<receiver android:name=".TestReceiver">
<intent-filter >
<action android:name="cn.flowingflying.proandroid.testbrocastreceiver.intent.testbc" />
</intent-filter>
</receiver>
![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/15/da6c87688e6d4170a103629850c2aaf3.jpg)
广播是可以被多个接收器接收的,我们copyTestReceiver的代码创建另一个接收器TestReceiver2,如下,并在AndroidManifest.xml中进行注册:
public class TestReceiver2 extends BroadcastReceiver{
private String tag = "TestReceiver2";
@Override public void onReceive(Context context, Intent intent) {
Utils.logThreadSignature(tag); //显示Thread的信息
Log.v(tag,"context = " + context);
Log.v(tag,"this = " + this);
Log.v(tag,"intent = " + intent);
String message = intent.getStringExtra("message");
Log.v(tag,"message : " + message);
}
}
运行结果如下。当发出广播时,所有注册的接收器都会收到。由于这两个接收器的onReceive()都运行在主线程,即同一个线程中,他们是顺序处理,而不是另行处理。可以猜测广播是放在消息队列中,处理时依次触发各接收器。我们可以将TestReceiver的处理时间增加,例如sleep()上几秒,依次处理会更明显。处理的顺序和Manifest中的登记顺序一致。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/15/5133d4aa78f8c0ae896db26e4d7ae6db.jpg)
小例子代码在:Pro Android学习:Broadcast小例子
相关链接: 我的Android开发相关文章
基础小例子
发送Broadcast intent
运行情况
应用间的广播
文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/
和activity、content provider以及service一样,BraodcastReceiver是Android的组件。广播接收器接收广播消息,并进行相应地处理。广播消息就是Android的broadcast intent。一个broadcast intent可以触发多个接收器。
基础小例子
小例子很简单,通过菜单触发发送Broadcast,然后通过Logcat观察接收器情况。发送Broadcast intent
private void sendBroadcast(){//为了保证action的唯一性,通常采用包名的namespace。
String actionString = "cn.flowingflying.proandroid.testbrocastreceiver.intent.testbc";
Intent bcIntent = new Intent(actionString);
bcIntent.putExtra("message", "No " + (count ++));
Log.v("Main","Before send");
//组件(acivity或者service)使用sendBrocast()进行发送广播消息,参数则是intent。
sendBroadcast(bcIntent);
Log.v("Main","After send");
}
Broadcast接收器
接收器实现很简单,继承BroadcastReceiver,同时要在manifest文件中通过<receiver>的tag来注册要监听的广播intent,我们也可以在运行时在代码中进行注册。
public class TestReceiver extends BroadcastReceiver{
private String tag = "TestReceiver";
@Override //收到广播的回调函数
public void onReceive(Context context, Intent intent) {
Utils.logThreadSignature(tag); //显示Thread的信息
Log.v(tag,"context = " + context);
Log.v(tag,"this = " + this);
Log.v(tag,"intent = " + intent);
String message = intent.getStringExtra("message");
Log.v(tag,"message : " + message);
}
}
需要通过AndroidManifest.xml告诉系统需要接受broadcast消息。<receiver>和其他组件一样是<application>的node。
<receiver android:name=".TestReceiver">
<intent-filter >
<action android:name="cn.flowingflying.proandroid.testbrocastreceiver.intent.testbc" />
</intent-filter>
</receiver>
运行情况
我们看看运行的接口,接收器运行在主线程中。![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/15/da6c87688e6d4170a103629850c2aaf3.jpg)
广播是可以被多个接收器接收的,我们copyTestReceiver的代码创建另一个接收器TestReceiver2,如下,并在AndroidManifest.xml中进行注册:
public class TestReceiver2 extends BroadcastReceiver{
private String tag = "TestReceiver2";
@Override public void onReceive(Context context, Intent intent) {
Utils.logThreadSignature(tag); //显示Thread的信息
Log.v(tag,"context = " + context);
Log.v(tag,"this = " + this);
Log.v(tag,"intent = " + intent);
String message = intent.getStringExtra("message");
Log.v(tag,"message : " + message);
}
}
运行结果如下。当发出广播时,所有注册的接收器都会收到。由于这两个接收器的onReceive()都运行在主线程,即同一个线程中,他们是顺序处理,而不是另行处理。可以猜测广播是放在消息队列中,处理时依次触发各接收器。我们可以将TestReceiver的处理时间增加,例如sleep()上几秒,依次处理会更明显。处理的顺序和Manifest中的登记顺序一致。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/15/5133d4aa78f8c0ae896db26e4d7ae6db.jpg)
应用间的广播
同一应用和不同应用都可以通过Manifest注册对同一广播的监听,在代码上区别,分别触发运行在各自的主线程的回调函数。小例子代码在:Pro Android学习:Broadcast小例子
相关链接: 我的Android开发相关文章
相关文章推荐
- 【转】 Pro Android学习笔记(九六):AsyncTask(5):横竖屏切换问题
- Android远程推送笔记
- 【转】 Pro Android学习笔记(九五):AsyncTask(4):执行情况
- 【转】 Pro Android学习笔记(九四):AsyncTask(3):ProgressDialog
- 【转】 Pro Android学习笔记(九三):AsyncTask(2):小例子
- 【转】 Pro Android学习笔记(九二):AsyncTask(1):AsyncTask类
- 分享一种最简单的Android打渠道包的方法
- 【转】 Pro Android学习笔记(九一):了解Handler(5):组件生命
- 【转】 Pro Android学习笔记(九十):了解Handler(4):Worker线程
- 【转】 Pro Android学习笔记(八九):了解Handler(3):延迟执行小例子
- 【转】 Pro Android学习笔记(八八):了解Handler(2):什么是Handler
- 【转】 Pro Android学习笔记(八七):了解Handler(1):组件和线程
- 【转】 Pro Android学习笔记(八六):了解Package(5):使用lib
- 百度地图 Android SDK - 标注(Marker)的基本使用
- 【转】 Pro Android学习笔记(八五):了解Package(4):lib项目
- 【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享
- 【转】 Pro Android学习笔记(八三):了解Package(2):包签名过程
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
- 【转】 Pro Android学习笔记(八一):服务(6):复杂数据Parcel
- 【转】 Pro Android学习笔记(八十):服务(5):访问远程服务