点滴:Android BroadcastReceiver【转】
2014-01-13 16:38
423 查看
1.BroadCast 广播:
使用很简单,实例化一个意图对象,把要发送的信息封装在意图对象中,然后使用Context。sendBroadCast()方法,把意图对象发送(即广播)出去。
代码示例:
Java代码![](http://yxwang0615.iteye.com/images/icon_star.png)
//用给出的action创建一个意图对象,该action在广播过滤器中要用到
Intent intent = new Intent("bc1");
//要广播的信息
intent.putExtra("val", BroadcastReceiver1.class.getName());
//发送广播
sendBroadcast(intent);
2.BroadCastReceiver广播接收器:
必须建立一个广播接收器来接收广播消息,广播接收器的核心是过滤器IntentFilter。建立广播接收器分为静态建立和动态建立:
首先要新建一个广播接收类继承BroadcastReceiver,重写onReceive方法;
代码示例,BroadcastReceiver1 .java:
Java代码![](http://yxwang0615.iteye.com/images/icon_star.png)
public class BroadcastReceiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
String val = arg1.getStringExtra("val");
Toast.makeText(arg0, "Get message:"+val, Toast.LENGTH_LONG).show();
}
}
①如果是静态建立:在清单文件中注册BroadCastReceiver;
代码示例,AndroidManifest.xml:
Xml代码![](http://yxwang0615.iteye.com/images/icon_star.png)
<receiver android:name=".BroadcastReceiver1">
<intent-filter >
<action android:name="bc1"/>
</intent-filter>
</receiver>
receiver节点的android:name是广播接收类的类名,intent-filter节点的android:name为要过滤的广播消息,只接受
action="bc1"的广播。
这样通过sendBoardCast(intent)发送出来的广播,被该广播接收器通过广播过滤器匹配后接收,并通过onReceive()方
法处理接收到的信息,完成了整个信息传递的过程。
②如果是动态建立,不需要在清单文件中注册BroadCastReceiver,在发送广播的类中实例化一个IntentFiltler的成员变
量,并在onStart()方法中注册广播过滤器,在onStop()方法中注销广播过滤器。
代码示例:
Java代码![](http://yxwang0615.iteye.com/images/icon_star.png)
public class MainAct extends Activity {
IntentFilter intentFilter = new IntentFilter();
BroadcastReceiver2 bc2 = new BroadcastReceiver2();
......
@Override
protected void onStart() {
super.onStart();
intentFilter.addAction("bc2");
registerReceiver(bc2, intentFilter);//注册监听
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(bc2); //取消监听
}
}
--------------------------------------------------本示例完整代码--------------------------------------------------------------
AndroidManifest.xml:
Xml代码
![](http://yxwang0615.iteye.com/images/icon_star.png)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.wyx.demo"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainAct"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".BroadcastReceiver1">
<intent-filter >
<action android:name="bc1"/>
</intent-filter>
</receiver>
</application>
</manifest>
MainAct.java:
Java代码
![](http://yxwang0615.iteye.com/images/icon_star.png)
/**
* 该页面负责发送广播信息:
* 发送广播消息,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,
* 然后通过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,
* 把 Intent对象以广播方式发送出去。
*/
public class MainAct extends Activity {
IntentFilter intentFilter = new IntentFilter();
BroadcastReceiver2 bc2 = new BroadcastReceiver2();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("bc1");
intent.putExtra("val", BroadcastReceiver1.class.getName());
sendBroadcast(intent);
}
});
Button btn2 = (Button)findViewById(R.id.btn2);
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("bc2");
intent.putExtra("val", BroadcastReceiver2.class.getName());
sendBroadcast(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
intentFilter.addAction("bc2");
registerReceiver(bc2, intentFilter);//注册监听
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(bc2); //取消监听
}
}
BroadcastReceiver1.java:
Java代码
![](http://yxwang0615.iteye.com/images/icon_star.png)
public class BroadcastReceiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
String val = arg1.getStringExtra("val");
Toast.makeText(arg0, "Get message:"+val, Toast.LENGTH_LONG).show();
}
}
Context.sendBroad()主要是用来广播无序事件(也被称为有序广播 Normal broadcast),即所有的接收者在理论上是同时接收到事件,同时执行的,对消息传递的效率而言这是比较好的做法。
Context.sendOrderedBroadcast()方法用来向系统广播有序事件(Ordered broadcast),接收者按照在Manifest.xml文件中设置的接收顺序依次接收Intent,顺序执行的,接收的优先级可以在系统配置文件中设置(声明在intent-filter元素的android:priority属性中,数值越大优先级别越高,其取值范围为-1000到1000。当然也可以在调用IntentFilter对象的setPriority()方法进行设置)。对于有序广播而言,前面的接收者可以对接收到得广播意图(Intent)进行处理,并将处理结果放置到广播意图中,然后传递给下一个接收者,当然前面的接收者有权终止广播的进一步传播。如果广播被前面的接收者终止后,后面的接收器就再也无法接收到广播了。
广播接收器(Broadcaset)运行的线程:
无论对于有序广播还是无序广播,广播接收器默认都是运行在主线程中的(main线程,即UI线程)。可以通过在程序中使用registerReceiver(receiver, filter, broadcastPermission, scheduler)方法中的最后一个参数指定要运行的广播接收器的线程。也可以在Manifest.xml文件中设置(Intent-filter标签中设置android:process)。
无序广播(Normal Broadcast)
基本步骤:写一个类继承BroadcastReceiver,并重写onReceive方法,而后在AndroidManifest.xml文中中进行配置,或者直接在代码中注册。
相关文章推荐
- Android 4.4(KitKat)中的设计模式-Graphics子系统
- Windows XP、Cygwin、NDKr5b编译Android下的ffmpeg
- Android中获取系统内存信息以及进程信息
- android.os.networkonmainthreadexception
- android 电话状态的监听(来电和去电)
- Android高级应用开发(基础篇) - stage6 - 学习笔记(上)
- android java 在sd卡中创建文件
- Android安装卸载Apk的接口
- Android源码下载及开发环境的搭建
- android 让一个控件按钮居于底部的几种方法
- android 调用设置页面开启gps
- 恢复 android logcat 不输出
- android 4.3源码下载【自己下载成功的步骤、其中遇到很多你可能会遇到的很多问题】
- Android input keyevent
- android替换fprintf使得打印可以输出到logcat中
- Android 解析JSON
- 假如有了android电脑系统
- Android混淆带有so文件的工程
- Android启动另一个apk程序
- Android:TextView跑马灯-详解