BroadCastReceiver用户监听被广播的事件,为了达到这种目的BroadCastReceiver必须被注册,注册方法有两种:
一、在AndroidManifest.xml中进行注册(这种方式在应用关闭后,依然会接收被广播的事件)
二、在应用程序的代码中通过代码进行注册(代码控制何时注册,何时接触注册,应用关闭自动取消注册)
实例一、AndroidManifest.xml中注册
第一步:编写自己的广播接收处理器,代码如下:
package com.goma.android; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class MyBroadCastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub System.out.println("MyBroadCastReceiver get receiver.."); } }
第二步:修改AndroidManifest.xml,在application标签中(一般在Activity后)添加如下代码:
<receiver android:name=".MyBroadCastReceiver"> <intent-filter> <action android:name="com.goma.android.TEST"/> </intent-filter> </receiver>
其实到这里就算完成了,但为了演示效果我们也个测试例子,代码如下:
package com.goma.android; 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 AndroidBroadCastReceiverActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button bt = (Button)findViewById(R.id.sendBroad); bt.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setAction("com.goma.android.TEST"); //发送广播 AndroidBroadCastReceiverActivity.this.sendBroadcast(intent); } }); } }
注意:intent.setAction("com.goma.android.TEST");标红处与AndroidManifest.xml中intent-filter标签中的子标签<action action:name="com.goma.android.TEST">标红处是相互对应的。
原理:在AndroidManifest.xml中注册的广播接收器,会接收Android系统或应用发出的广播信息,并检测广播信息是否属于自己监听的类型,如果属于,则调用相应的接收处理器;如果不属于则不处理。
实例二、代码中注册广播接收器与取消广播接收器
第一步:创建广播接收器,代码如下:
package com.goma.android; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsMessage; public class SMSBoradCastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub System.out.println("SMSBroadCastReceiver onReceive Method...."); Bundle bundle = intent.getExtras(); // Iterator<String>keys = bundle.keySet().iterator(); // while(keys.hasNext()){ // System.out.println(keys.next()); // } Object[]pdus = (Object[])bundle.get("pdus"); SmsMessage[]messages = new SmsMessage[pdus.length]; for(int i=0;i<pdus.length;i++){ messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]); System.out.println(messages[i].getDisplayMessageBody()); } System.out.println("#################"); } }
第二步:修改AndroidManifest.xml,在<application>标签后声明引用所需的权限,这里用的的是手机短信读取权限,如下:
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
第三步:代码控制注册广播接收器与取消广播接收器,代码如下:
package com.goma.android; 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 AndroidBroadCastReceiver2Activity extends Activity { /** Called when the activity is first created. */ private static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED"; private SMSBoradCastReceiver receiver; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button regist = (Button)findViewById(R.id.regist); regist.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub receiver = new SMSBoradCastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(SMS_ACTION); AndroidBroadCastReceiver2Activity.this.registerReceiver(receiver, filter); System.out.println("Regist BroadCastReceiver"); } }); Button unregist = (Button)findViewById(R.id.unregist); unregist.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub AndroidBroadCastReceiver2Activity.this.unregisterReceiver(receiver); System.out.println("Unregist BroadCastReceiver"); } }); } }
注意:类里声明的SMS_ACTION与AndroidManifest.xml中的权限申请是有关系的,这里需要的是监听接收短信的广播接收器,那么AndroidManifest.xml中就必须声明该应用需要短信的相关权限,具体见Android API