什么是广播
在Android中,BroadCast是一种广泛运用在应用程序之间传输信息的机制。它类似与我们平时的广播电台,只要我们将频率调成和某电台的一致,我们就能收听到这个电台的内容。BroadCast也一样,只有将发送广播的action和接收广播的action相同,我们才能接收到发送者发送过来的消息。
广播机制三要素
android广播机制包含三要素:
1. 广播(BroadCast) —— 用与发送广播;
2. 广播接收器(BroadcastReceiver) —— 用于接受广播;
3. 意图内容(Intent) —— 用于保存广播相关信息的媒介;
广播的作用
广播,在android笼统一点讲就是用来传递数据的。广播作为四大组件之一,其最大的特点就是发送方并不关心接收方是否接收到了数据,也不关心接收方是如何处理接收到的这些数据。广播接收器没有用户界面。然而它可以启动一个activity或者Service来响应他们收到的信息,或者用NotificationManager来通知用户。 广播事件处理机制是系统级别的,我们把广播接收器这个类或者对象注册到android操作系统上,当有广播事件产生时,andorid操作系统首先先告诉注册到其上面的广播接收器产生了一个咋样的事件,每个接收器根据自身的action来判断是不是自己所需要的事件,如果是,则进行相应的处理。
实现广播
android提供了两种方式来注册广播,分别是程序中动态注册和在AndroidManifest.xml中进行静态配置。他们之间的区别就是作用范围不同:动态注册只在程序运行过程中有效,而静态注册的不管你的程序有没有启动都会起作用。
静态注册
1.编写一个类继承BroadcastReceiver,重写其中的onReceive(Context arg0, Intent arg1)方法
/**
* 步骤1.编写一个类继承BroadcastReceiver
* @author Administrator
*
*/
public class MyReciver extends BroadcastReceiver{
public static final String TAG = "MyReciver";
@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
Log.d(TAG, "接收到广播");
}
}
2.在AndroidManifest.xml中注册广播,过滤接收广播类型(可以接收自己发送的广播,也可以接收系统发送的广播);
<!-- 步骤2: 在AndroidManifest.xml中注册广播 -->
<receiver android:name="com.example.ztest1.MyReciver"
android:exported="false">
<intent-filter>
<action android:name="com.example.ztest1.ACTION"/>
</intent-filter>
</receiver>
3.发送广播(自己的广播),使用sendBroadcast(intent)方法来发送广播,在intent中加上标识来便于接收者识别。
public class MainActivity extends Activity {
private Button btn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new BtnOnClickListener());
}
/**
* 步骤3: 发送广播
* @author Administrator
*
*/
public static final String ACTION = "com.example.ztest1.ACTION";
public class BtnOnClickListener implements OnClickListener{
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch (arg0.getId()) {
case R.id.btn1:
{
Intent intent = new Intent();
intent.setAction(ACTION);
sendBroadcast(intent);
}
break;
default:
break;
}
}
}
}
动态注册
动态注册的步骤除第二步以外,基本和静态注册的步骤一致。
public class MainActivity extends Activity {
public static final String ACTION = "com.example.ztest1.ACTION";
private Button btn1;
private Button btn2;
private Button btn3;
private MyBroadcastReceiver MyBcr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
btn3 = (Button) findViewById(R.id.btn3);
btn1.setOnClickListener(new BtnOnClickListener());
btn2.setOnClickListener(new BtnOnClickListener());
btn3.setOnClickListener(new BtnOnClickListener());
}
public class BtnOnClickListener implements OnClickListener{
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch (arg0.getId()) {
case R.id.btn1:
{
/*注册广播*/
if(null != MyBcr){
unregisterReceiver(MyBcr);
}
MyBcr = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION);
registerReceiver(MyBcr, filter);
}
break;
case R.id.btn2:
{
/*取消注册*/
if(null != MyBcr){
unregisterReceiver(MyBcr);
MyBcr = null;
}
}
break;
case R.id.btn3:
{
/*发送广播*/
Intent intent = new Intent();
intent.setAction(ACTION); /*确保和注册时的action相同*/
intent.putExtra("receive_msg", "全体村民请注意:");
sendBroadcast(intent);
}
break;
default:
break;
}
}
}
public class MyBroadcastReceiver extends BroadcastReceiver{
/*
* 生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,
* 就会报ANR(Application No Response) 程序无响应的错误信息,如果
* 需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service,
* 由Service 来完成
*/
@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
String msg = arg1.getStringExtra("receive_msg");
Toast.makeText(arg0, msg, Toast.LENGTH_SHORT).show();
}
}
/**
* 动态注册的广播,当注册的activity关掉后,广播就失效了
* register 和 unregister 相对应,防止内存泄漏
*/
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
this.unregisterReceiver(MyBcr);
super.onDestroy();
}
}
广播的生命周期
广播接收器仅在它执行这个方法时处于活跃状态。当onReceive()返回后,它即为失活状态。如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由Service 来完成。