首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()方法,把Intent对象以广播方式发送出去。
当Intent发送以后,所有已经注册的广播接收器会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。
实例
A.编写广播接受者的发送方
1.布局文件 点击发送广播
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:onClick="send"
android:text="send" />
</RelativeLayout>
2编写广播接受者
package com.example.broadcasetsend;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
public class MainActivity extends Activity {
private static final String broadcast = "com.chj";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//自定义广播
public void send(View view) {
Intent intent = new Intent();
intent.setAction(broadcast);
// broadcast可以是系统广播,也可以是自己定义的
// 一个action
intent.putExtra("name", "suzhou");
sendBroadcast(intent);
}
}
这样广播接受者的发送方编写完成
B.广播接受者的接收方
1.只需要编写接受者即可
package com.example.broadcastrecieve;
import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.view.Menu;
//动态注册广播 其生命周期和调用者一致 一旦Activity退出 动态广播接受者也就退出
public class MainActivity extends Activity {
private static final String broadcast = "com.chj";
MyBroadCastReceiver myBroadCastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化广播接受者
myBroadCastReceiver =new MyBroadCastReceiver();
//过滤
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(broadcast);
//注册广播 只有注册完广播 广播接受者才能监听到消息
registerReceiver(myBroadCastReceiver, intentFilter);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
//在onCreate注册广播,一般在onDestroy取消注册 确保在后台也可以监听广播
//若不想在后台监听广播可以在onStart注册 在onStop取消
unregisterReceiver(myBroadCastReceiver);
super.onDestroy();
}
// 监听广播 onReceive不能执行耗时操作(不超过10s 否则发生ANR)
private class MyBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取广播的action,若匹配,取得意图中的数据
// TODO Auto-generated method stub
String actionString = intent.getAction();
if (actionString.equals(broadcast)) {
//取得意图中的数据
String nameString = intent.getExtras().getString("name");
Log.e("chj", nameString);
}
}
}
}
此处采用动态方式注册广播接受者,不需要在清单文件配置广播接受者 接收方也编写完毕
注册BroadcastReceiver有两种方式:
一种方式是,静态的在AndroidManifest.xml中用<receiver>标签声明注册,并在标签内用<intent- filter>标签设置过滤器。
另一种方式是,动态的在代码中先定义并设置好一个 IntentFilter 对象,然后在需要注册的地方调Context.registerReceiver()方法,如果取消注册就调用 Context.unregisterReceiver()方法。用动态方式注册的BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。(特别注意,有些可能需要后台监听的,如短信消息)
程序运行步骤:
先安装发送方 再安装接收方
安装完毕后,运行接收方按home键让程序在后台监听广播
在运行发送方,点击send,广播logcat会有输出
在onCreate注册广播,一般在onDestroy取消注册 确保在后台也可以监听广播
若不想在后台监听广播可以在onStart注册 在onStop取消
若果将onDestroy代码移到onStop,不在在onCreate注册而在onStart注册广播,再按上面步骤执行,会发现后台不在监听广播