一、Android 的广播机制
在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一个广播,应用程序开发者也可以监听这些广播并做出程序逻辑的处理。下面我画一张粗略的图来帮助大家理解广播的运行机制。
Android 中有各式各样的广播,各种广播在Android 系统中运行,当系统/应用程序运行时便会向 Android 注册各种广播,Android 接收到广播会便会判断哪种广播需要哪种事件,然后向不同需要事件的应用程序注册事件,不同的广播可能处理不同的事件也可能处理相同的广播事件,这时就需要Android 系统为我们做筛选。
二、如何编写广播接收器
第一步:需要继承BroadcastReceiver类,覆写其中的onReceive()方法.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package lpq.testbc; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class TestReceiver extends BroadcastReceiver{ public TestReceiver(){ System.out.println("TestReceiver"); } @Override public void onReceive(Context context, Intent intent) { System.out.println("onReceive"); } } |
第二步:定义好广播接收器还不行,必须向系统注册以便让其知道该接收器可以处理哪些广播事件。
常见方式是采用静态注册,修改AndroidManifest.xml文件, 在<application></application>中加入receiver标签。
1 2 3 4 5 | <receiver android:name=".TestReceiver"> <intent-filter> <action android:name="android.intent.action.EDIT" /> </intent-filter> </receiver> |
第三步:此时我们可以发送一个广播事件出去,代码如下:
1 2 3 | Intent intent = new Intent(); intent.setAction(Intent.ACTION_EDIT); TestActivity.this.sendBroadcast(intent); |
三、动态注册广播接收器
在某个Activity中,我们可以用代码来实现动态注册:
1 2 3 4 5 6 7 8 | //生成一个BroiadcastReceiver对象 smsReceiver = new SMSReceiver(); //生成一个IntentFilter对象 IntentFilter filter = new IntentFilter(); //为IntentFilter添加一个Action filter.addAction(SMS_ACTION); //将BroadcastReceiver对象注册到系统当中 TestBC2Activity.this.registerReceiver(smsReceiver, filter); |
收到广播后我们也可以对广播的内容进行处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package lpq.testbc2; 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(); //在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(); } } } |
也可以手工取消绑定。
1 2 | //解除BroadcastReceiver对象的注册 TestBC2Activity.this.unregisterReceiver(smsReceiver); |
四、静态注册和动态注册的区别
1)静态注册:在AndroidManifest.xml注册,android不能自动销毁广播接收器,也就是说当应用程序关闭后,还是会接收广播。
2)动态注册:在代码中通过registerReceiver()手工注册.当程序关闭时,该接收器也会随之销毁。当然,也可手工调用unregisterReceiver()进行销毁。
五、Android 广播的生命周期
在上面的接收器中,继承了BroadcastReceiver 并重写了它的onReceive 并构造了一个函数,下面通过图片来一步一步认识 Android 广播的生命周期。当我点击一下按钮,它向Android 发送了一个广播,如下图:
这时我们再点击一下按钮,它还是会再向 Android 系统发送广播,此时日志信息如下:
下面本人画一张图像,描述了Android 中广播的生命周期,其次它并不像Activity 一样复杂,运行原理很简单如下图:
如果一个广播处理完onReceive 那么系统将认定此对象将不再是一个活动的对象,也就会finished掉它。
除非注明,Coder文章均为原创,转载请以链接形式标明本文地址