1、广播机制
(1、广播接收者在Android中注册
(2、当一个事件产生后,它可以发送一个广播信息,然后这些接收者来接收这些信息
(3、广播接收者的实现一般是写成一个类,该类继承Android提供的类BroadcastReceiver,并且复写该类的onCreate方法,在该方法中实现接收到信息后的处理过程
2、实例
例1:采用在 Mainifest.xml文件中注册BroadcastReceiver
首先在发送端Main.java建立一个intent,然后通过它的setAction方法设置接收器的action类型,
最后在activity中启动broadcast,即sendBroadcast(intent)函数
TestReceiver.java
1 package zzl.broadcast_01; 2 3 import android.content.BroadcastReceiver; 4 import android.content.Context; 5 import android.content.Intent; 6 7 public class TestReceiver extends BroadcastReceiver{ 8 9 public TestReceiver() 10 { 11 System.out.println("TestReceiver"); 12 13 } 14 @Override 15 public void onReceive(Context arg0, Intent arg1) { 16 System.out.println("OnReceiver"); 17 18 } 19 }
Main.java
1 package zzl.broadcast_01; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.Menu; 7 import android.view.View; 8 import android.view.View.OnClickListener; 9 import android.widget.Button; 10 11 public class Main extends Activity { 12 13 private Button insert = null; 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 19 insert=(Button)findViewById(R.id.insert); 20 insert.setOnClickListener(new MyStartOnClickListener()); 21 } 22 public class MyStartOnClickListener implements OnClickListener 23 { 24 25 public void onClick(View arg0) { 26 // TODO Auto-generated method stub 27 28 //采用intent发送数据 29 Intent intent = new Intent(); 30 //只发送给action为ACTION_EDIT的对象,对应Manifest中的action 31 intent.setAction(Intent.ACTION_EDIT); 32 //*通过广播方式发送该intent,只有特定action的接收者才能收到该广播信息*/ 33 Main.this.sendBroadcast(intent); 34 } 35 } 36 @Override 37 public boolean onCreateOptionsMenu(Menu menu) { 38 // Inflate the menu; this adds items to the action bar if it is present. 39 getMenuInflater().inflate(R.menu.activity_main, menu); 40 return true; 41 } 42 43 }
结果:
3、实例1总结
需要在Android中注册,也就是说在Manifest中,需要在<application/>中有这样的代码:
1 <receiver 2 android:name=".TestReceiver"> 3 <intent-filter> 4 <action android:name="android.intent.action.EDIT"/> 5 </intent-filter> 6 </receiver>
4、实例2
(1、 BroadcastReceive用于监听被广播的事件(intent),为此它必须进行注册,与例子1中在Manifest.xml当中进行注册的注册方法不同,
例子2将引入第二种方法,在应用程序的代码中进行注册。在例1中,如果应用程序已经关闭,BroadcastReceive都会处于活动状态,都会接收到广播信息。这个就需要各取所需
了。
(2、如果一个BroadcastReceive用于更新UI,则采用在代码中进行注册:Activity启动时注册,关闭时取消注册。
【注册】 registerReceiver(receiver ,filter) ; 【取消注册】 unregisterRecevier(receiver);
MainActivity.java
1 package zzl.broadcast_02; 2 3 import android.app.Activity; 4 import android.content.IntentFilter; 5 import android.os.Bundle; 6 import android.view.Menu; 7 import android.view.View; 8 import android.view.View.OnClickListener; 9 import android.widget.Button; 10 11 public class MainActivity extends Activity { 12 13 private Button registe=null; 14 private Button unregiste=null; 15 private SMSReceiver smsReceiver=null; 16 private static final String SMS_ACTION="android.provider.Telephony.SMS_RECEIVED"; 17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.activity_main); 21 22 registe=(Button)findViewById(R.id.regiest); 23 unregiste=(Button)findViewById(R.id.unregiest); 24 25 registe.setOnClickListener(new RegisterRecevierListener()); 26 unregiste.setOnClickListener(new UnRegisterRecevierListener()); 27 } 28 29 class RegisterRecevierListener implements OnClickListener{ 30 31 @Override 32 public void onClick(View v) { 33 // TODO Auto-generated method stub 34 /* 1、生成一个BroadcastRecevier对象 35 * 2、生成一个intentFilter对象(和Manifest中的Filter) 36 * 3、为IntentFilter添加一个Action:SMS_ACTION 37 * (只有filter中的action和intent中的action一样) 38 * 4、将BroadcastRecevier对象注册到系统当中 39 * */ 40 smsReceiver =new SMSReceiver(); 41 IntentFilter filter=new IntentFilter(); 42 filter.addAction(SMS_ACTION); 43 MainActivity.this.registerReceiver(smsReceiver,filter); 44 System.out.println("promise to receive message"); 45 } 46 } 47 class UnRegisterRecevierListener implements OnClickListener{ 48 49 @Override 50 public void onClick(View v) { 51 // TODO Auto-generated method stub 52 //解除BroadcastRecevier对象注册 53 MainActivity.this.unregisterReceiver(smsReceiver); 54 System.out.println("unpromise to receive message"); 55 } 56 } 57 58 59 @Override 60 public boolean onCreateOptionsMenu(Menu menu) { 61 // Inflate the menu; this adds items to the action bar if it is present. 62 getMenuInflater().inflate(R.menu.activity_main, menu); 63 return true; 64 } 65 66 }
SMSReceiver.java
1 package zzl.broadcast_02; 2 3 import android.content.BroadcastReceiver; 4 import android.content.Context; 5 import android.content.Intent; 6 import android.os.Bundle; 7 import android.telephony.SmsMessage; 8 9 10 public class SMSReceiver extends BroadcastReceiver{ 11 12 @Override 13 public void onReceive(Context context, Intent intent) { 14 // TODO Auto-generated method stub 15 System.out.println("receive message"); 16 17 //通过intent获得bundle对象中的数据 18 Bundle bundle = intent.getExtras(); 19 //在bundle对象中有个名为“pdus”的属性,这个属性的值是object数组 20 Object[] myOBJpdus = (Object[])bundle.get("pdus"); 21 //新建一个SmsMessage数组:用于存储消息内容的 22 SmsMessage[] messages = new SmsMessage[myOBJpdus.length]; 23 System.out.println(messages.length); 24 for(int i = 0; i < messages.length; i++) 25 { 26 //使用object数组当中的对象创建SmsMessage对象: 27 messages[i] = SmsMessage.createFromPdu((byte[])myOBJpdus[i]); 28 //调用SmsMessage对象的getDisplayMessageBody()方法,就可以得到消息的内容 29 System.out.println(messages[i].getDisplayMessageBody()); 30 } 31 } 32 }
结果:
5、实例2总结
(1、 设置的action过滤为"android.provider.Telephony.SMS_RECEIVED",即只有具备该action的广播接收器才能给接收到短信。
(2、 发送短信采用的是DDMS来模拟的,即该短信的发送是由另外的程序执行的。
DDMS发送出来的短信息是通过intent发送的,intent里面就自带了名为"android.provider.Telephony.SMS_RECEIVED"的action。
(3、要使自己写的android程序能够收到短信息来临的广播,则不管是在应用程序中注册broadcastReceiver还是在Manifest.xml中注册,
在manifest.xml文件中必须添加一句代码:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
并且该代码是和application平级的,也就是说是manifest的直接子标签.如果没有改句,即使程序中注册过广播接收,同样也收不到短信的。
一开始没有意识到这个问题,导致程序在测试过程中,出现了bug,百度过后才找到原因,以此为戒。