Android Broadcast广播机制

一、Android 的广播机制

在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一个广播,应用程序开发者也可以监听这些广播并做出程序逻辑的处理。下面我画一张粗略的图来帮助大家理解广播的运行机制。

image

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 发送了一个广播,如下图:

image

这时我们再点击一下按钮,它还是会再向 Android 系统发送广播,此时日志信息如下:

image

下面本人画一张图像,描述了Android 中广播的生命周期,其次它并不像Activity 一样复杂,运行原理很简单如下图:

如果一个广播处理完onReceive 那么系统将认定此对象将不再是一个活动的对象,也就会finished掉它。

除非注明,Coder文章均为原创,转载请以链接形式标明本文地址

本文地址:http://www.alonemonkey.com/android-broadcast.html

本文链接:http://www.alonemonkey.com/android-broadcast.html