作为Android四大组件之一,BroadcastReceiver主要是用来接收处理广播消息,处理消息要overWrite它的onReceive()方法,在其中做处理。Broadcast工作在主线程中,所以我们可以直接操作主界面的内容。使用BroadcastReceiver首先要注册广播接收器。
1.注册广播接收器
有两种方式可以注册广播接收器,一种是在代码中动态注册,一种是在manifest清单文件中静态注册,这两种是有差别的,清单文件一旦注册即使Activity销毁掉仍可以接收到广播,动态注册则是Activity销毁后就不能接收到广播消息(思考,如何取消注册manifest中生命的静态注册)。
静态注册方式是在manifest清单文件中的application子标签下注册如下代码:
<span style="white-space:pre"> </span><receiver android:name="com.test.testbroadcast.MyReceiver" >
<intent-filter>
<action android:name="com.test.action.MY_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
其中android:name声明的自己写的BroadcastReceiver的子类的全路径名,intent-filter子标签下声明 要过滤的意图,action的android:name属性是发送广播时候的意图String,可以是自己定义的,也可以是系统的通知消息。category子标签声明的是意图的种类。
动态注册是在activity中利用代码进行注册,registerReceiver()需要设置意图的<span style="font-family: Arial, Helvetica, sans-serif;">IntentFilter</span>对象和要注册的自定义的BroadcastReceiver对象作为参数。具体代码如下:
<span style="white-space: pre;"> </span>receiver = new MyReceiver(btn_register);//此构造方法是为了演示通过发送广播,接收器接收到后更新主界面中的button的text
<pre name="code" class="java"> IntentFilter filter = new IntentFilter();
filter.addAction(action);
registerReceiver(receiver, filter);
2.复写BroadcastReceiver类
<span style="white-space:pre"> </span>主要是复写其中的onReceive()方法,
<pre name="code" class="java"><span style="white-space:pre"> </span>public void onReceive(Context context, Intent intent) {
String string = intent.getStringExtra("msg");
Toast.makeText(context, string, Toast.LENGTH_SHORT).show();
}
3.发送广播消息
<span style="white-space:pre"> </span>Intent intent = new Intent();
<span style="white-space:pre"> </span>intent.setAction(action);
<span style="white-space:pre"> </span>intent.putExtra("msg", "哈哈哈,broadcast!");
<span style="white-space:pre"> </span>sendBroadcast(intent);
完整代码如下
主MainActivity.java
<pre name="code" class="java">import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
protected static final String action = "com.test.action.MY_ACTION";
private Button btn_send;
private Button btn_register;
private Button btn_unregister;
private MyReceiver receiver;
private boolean isRreceivered = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn_send = (Button) findViewById(R.id.btn_send);
btn_register = (Button) findViewById(R.id.btn_register);
btn_unregister = (Button) findViewById(R.id.btn_unregister);
btn_unregister.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (isRreceivered) {
unregisterReceiver(receiver);
isRreceivered = false;
btn_register.setText("注册广播");
}
}
});
btn_register.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!isRreceivered) {
receiver = new MyReceiver(btn_register);
IntentFilter filter = new IntentFilter();
filter.addAction(action);
registerReceiver(receiver, filter);
isRreceivered = true;
}
}
});
btn_send.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(action);
intent.putExtra("msg", "哈哈哈,broadcast!");
sendBroadcast(intent);
}
});
}
}
MyReceiver.java文件:
<pre name="code" class="java">import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Button;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
private Button btn;
public MyReceiver(Button btn) {
this.btn = btn;
}
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
String string = intent.getStringExtra("msg");
Toast.makeText(context, string, Toast.LENGTH_SHORT).show();
btn.setText("已注册!");
}
}
Manifest.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.testbroadcast"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.test.testbroadcast.MainActivity"
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="com.test.testbroadcast.MyReceiver" >
<intent-filter>
<action android:name="com.test.action.MY_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>
</manifest>