同步自:http://www.elitor.org/?p=211
1.Android系统在发生相应事件的时候一般都会发出广播,当然我们也可以自己广播,通常只需用Intent作为广播内容。
2.接收广播,如果我们想接收系统广播或者自定义广播,那么必须继承BroadcastReceiver,重写它的onReceive函数即可,函数原型为:
public void onReceive(Context context, Intent intent)
3.要想接收到广播信息必须向系统注册广播接收器,通常有两种方法:
3.1在manifest.xml直接注册,指明receiver和intent-filter,特点是在程序退出时仍然可以接收广播
3.2通过写代码注册,调用registerReceiver函数注册,unregisterReceiver卸载,在程序退出的时候不会接收广播
eg1:自己广播一个事件,接收广播事件,用3.2的方式注册接收器。
Activity:
package org.elitor;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ExBroadcast extends Activity
{
/** Called when the activity is first created. */
private Button btn = null;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button)findViewById(R.id.btnBroCst);
btn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
//创建一个Intent对象
Intent mIntent = new Intent(Intent.ACTION_EDIT);
//发送广播,需要对应在manifest.xml文件中注册广播
ExBroadcast.this.sendBroadcast(mIntent);
}
});
}
}
自定义的接收器类继承BroadcastReceiver,向系统注册后,一旦系统发出广播将执行 onReceive函数。
package org.elitor;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class BroadCastListener extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
// TODO Auto-generated method stub
System.out.println("onReceive");
}
}
AndroidManifest.xml中注册接收器。
<receiver android:name="BroadCastListener">
<intent-filter>
<action android:name="android.intent.action.EDIT" />
</intent-filter>
</receiver>
eg2:接收系统广播事件(收到短信的广播),用3.2的方式注册接收器。
一般是在Activity中注册广播接收器,可以在Activity的终止的时候注销监听。
注册分四步:
//1.生成一个BroadcastReceiver的子类对象,(自己在子类中实现onrecive函数)
smsReceiver = new SMSReceiver();
//2.生成一个IntentFilter对象
IntentFilter filter = new IntentFilter();
//3.为IntentFilter添加一个Action
filter.addAction(SMS_ACTION);
//4.将BroadcastReceiver对象注册到系统当中
BroadCaActivity.this.registerReceiver(smsReceiver, filter);
注销很简单:一句话搞定
BroadCaActivity.this.unregisterReceiver(smsReceiver);
例子代码全文,xml很简单,一个Btn,不给出了。
Activity:
package elitor.org;
import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class BroadCaActivity extends Activity
{
private boolean flag = true;
private Button btn = null;
private SMSReceiver smsReceiver = null;
private static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button)findViewById(R.id.btn);
btn.setText("监听广播");
btn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
// TODO Auto-generated method stub
if(flag)
{
flag = false;
btn.setText("禁止监听广播");
//生成一个BroadcastReceiver对象
smsReceiver = new SMSReceiver();
//生成一个IntentFilter对象
IntentFilter filter = new IntentFilter();
//为IntentFilter添加一个Action
filter.addAction(SMS_ACTION);
//将BroadcastReceiver对象注册到系统当中
BroadCaActivity.this.registerReceiver(smsReceiver, filter);
System.out.println("11111111111111111111111111111111111111111");
}
else
{
flag = true;
btn.setText("监听广播");
//注销BroadcastReceiver对象的注册
BroadCaActivity.this.unregisterReceiver(smsReceiver);
System.out.println("222222222222222222222222222222222222222222");
}
}
});
}
}
BroadCastListener:
package elitor.org;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
public class SMSReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
// TODO Auto-generated method stub
System.out.println("receive message");
//接受Intent对象当中的数据,处理数据
Bundle bundle = intent.getExtras();
Object[] myOBJpdus = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[myOBJpdus.length];
System.out.println(messages.length);
for (int i = 0; i<myOBJpdus.length; i++)
{
messages[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]);
System.out.println(messages[i].getDisplayMessageBody());
}
}
}
Actvity中定义了一个Button对象,点击监控,再次点击取消监听,一旦有短信接收,将执行SMSReceiver类的onReceive函数。