Android广播机制简介:
在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信或者打出一个电话,如果某个程序接收了这条广播,就会做相应的处理。而且该广播可以被不止一个应用程序所接收,当然也可以不被任何程序所接收。
广播机制最大的特点就是发送方并不关心接收方是否接收数据,也不关心接收方如何处理数据。
对于该广播是否被一个应用程序所接收,取决于这个应用程序是否注册BroadcastReceiver,因为roadcastReceiver用于监听被广播的事件(intent),为了达到这个目的,BroadcastReceiver必须被注册,注册的方法有以下两种:
1、静态注册方法
在AndroidManifest.xml的application里面定义receiver并设置要接收的action
其特点为:不管该应用程序是否处于活动状态,都会进行监听。
也就是说,这个程序无论是否开启,都会接收广播,并作出相应处理。如果一个程序接收是手机电量低的提醒,那么这个机制就很适合,因为不用顾忌这个程序是否关闭或者开启,都能得到手机电量低的提醒。但是,如果是接收某个广播来对该程序的Activity主页面的改变,那么这种机制就没有必要,因为当程序关闭时,我们不会关心这个程序页面的变化,而造成电量以及手机性能的影响。
2、在应用程序中注册
如果想避免上一种后果,那么就可以在应用程序中注册BroadcastReceiver。这样可以很方便的注册和取消注册,从而决定对广播是否接受。
下面是静态注册的实例:
广播发送:
package com.ye_yun_lin.broadcastreceiver;import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity { private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button=(Button)findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(); intent.setAction(intent.ACTION_EDIT); MainActivity.this.sendBroadcast(intent); } }); }}
广播接收:
package com.ye_yun_lin.broadcastreceiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class Receiver extends BroadcastReceiver { public Receiver(){ System.out.println("--Receiver"); } @Override public void onReceive(Context context, Intent intent) { System.out.println("--onReceiver"); }}
BroadcastReceiver注册:
<receiver android:name="com.ye_yun_lin.broadcastreceiver.Receiver"> <intent-filter> <action android:name="android.intent.action.EDIT"/> </intent-filter> </receiver>
输出结果:
下面是在应用程序中注册的实例:
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(); //在Bundle对象当中有一个属性名为pdus,这个属性的值是一个Object数组 Object[] myOBJpdus = (Object[]) bundle.get("pdus"); //创建一个SmsMessage类型的数组 SmsMessage[] messages = new SmsMessage[myOBJpdus.length]; System.out.println(messages.length); for (int i = 0; i<myOBJpdus.length; i++) { //使用Object数组当中的对象创建SmsMessage对象 messages[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]); //调用SmsMessage对象的getDisppalyMessageBody()方法,就可以得到消息的内容 System.out.println(messages[i].getDisplayMessageBody()); } try { Thread.sleep(30 * 1000); System.out.println("-------------------------------"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
public class TestBC2Activity extends Activity { /** Called when the activity is first created. */ private Button registerButton = null; private Button unregisterButton = null; private SMSReceiver smsReceiver = null; private static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); registerButton = (Button)findViewById(R.id.register); registerButton.setOnClickListener(new RegisterReceiverListener()); unregisterButton = (Button)findViewById(R.id.unregister); unregisterButton.setOnClickListener(new UnRegisterReceiverListener()); } class RegisterReceiverListener implements OnClickListener{ @Override public void onClick(View v) { //生成一个BroiadcastReceiver对象 smsReceiver = new SMSReceiver(); //生成一个IntentFilter对象 IntentFilter filter = new IntentFilter(); //为IntentFilter添加一个Action filter.addAction(SMS_ACTION); //将BroadcastReceiver对象注册到系统当中 TestBC2Activity.this.registerReceiver(smsReceiver, filter); } } class UnRegisterReceiverListener implements OnClickListener{ @Override public void onClick(View v) { //解除BroadcastReceiver对象的注册 TestBC2Activity.this.unregisterReceiver(smsReceiver); } }}