BroadCast Receiver(广播接收器)相似于事件处理的机制,只不过这种事件是系统级别的广播事件。咱们既可使用Intent的sendBroadcast方法发送广播事件,也能够在程序中实现Broadcast Reciever来监听和响应这些广播事件包括系统自身产生的广播事件,例如收到短信,电池充满等。下面是本人在学习过程当中的概括和心得。android
1. 发送广播事件
发送广播事件能够经过Intent的sendBroadcast方法,定义Intent对象的Action。一旦系统中广播接收器定义的过滤器中容许接受该广播,就可对所受到的广播进行响应。代码以下:ide
-
- Intent intent = new Intent();
-
- intent.setAction(MY_ACTION);
-
- sendBroadcast(intent);
|
2. 接受广播消息
经过继承于BroadcastReceiver的子类接受广播消息。首先须要在AndroidManifest.xml文件中加入receive标签,并加入Intent过滤器,声明能够接收的Intent。以下:
- <receiver android:name=".MyReciever">
- <intent-filter>
- <action android:name="ACTION"/>
- </intent-filter>
- </receiver>
|
对广播消息的响应是经过复写onRecieve()方法体来实现。在该方法中,处理的是系统广播事件接收短信,在方法中,将短信读取,并在提示消息中显示出来。具体实现方法以下:
- public class SMSReceiver extends BroadcastReceiver
- {
-
- public void onReceive(Context context, Intent intent)
- {
- Bundle bundle = intent.getExtras();
- Object messages[] = (Object[]) bundle.get("pdus");
- SmsMessage smsMessage[] = new SmsMessage[messages.length];
- for (int n = 0; n < messages.length; n++)
- {
- smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
- }
-
- Toast toast = Toast.makeText(context, "短信内容: " + smsMessage[0].getMessageBody(), Toast.LENGTH_LONG);
-
-
-
- toast.show();
- }
- }
|
广播接收器既能够用于接收自定义的广播消息,也能够接收系统内部的广播事件。经过修改AndroidManifest.xml中接收器标签中的过滤器来实现。若是想要对系统接收到短信这个广播事件进行响应,则须要进行以下配置:
- <receiver android:name=".MyReciever">
- <intent-filter>
- <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
- </intent-filter>
- </receiver>
- //记得加上接收短信的权限
- <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
|
3. 须要注意的问题学习
a. 一旦广播接收器可以响应的事件出现,它就会被触发而无论这个应用程序有没有被启动。可是对于一些须要对UI进行操做的响应来讲,这种机制是不合适的,不须要在没有UI的时候响应消息。系统中提供了另一种注册广播接收器的方法,能够随着应用程序的开启和关闭自动开始和结束响应。代码以下:this
-
- smsReceiver = new SMSReceiver();
-
- IntentFilter filter = new IntentFilter();
-
- filter.addAction(SMS_ACTION);
-
- TestBC2Activity.this.registerReceiver(smsReceiver, filter);
-
-
- //解除BroadcastReceiver对象的注册
TestBC2Activity.this.unregisterReceiver(smsReceiver);
-
|
b. 须要区分Activity和Service接收消息与广播接收器接收消息机制的不一样。spa
首先,前者接受消息的机制,既能够经过显式的指明组件名称传递,也能够经过设置接受组件的过滤器来隐式的传递。后者只能经过设置过滤器的方法来接收事件;xml
其次,startActivity()(startService())对应一个Activity或者Service,能够开启一个活动或者服务。sendBroadcast()对应onRecieve(),它只能用于接收广播事件;对象
再次,对于前者接受的系统事件,须要由用户本身指定传递的类型(ACTION)。而后后者所接收的广播事件,不只能够接收自定义的广播事件,也能够由系统本身发出(BROADCAST),用户仅仅定义接受器便可;继承
另外,前者在应用程序启动状态才接受消息;然后者只要接收到广播信息,就能够作出相应(在代码中注册接收器除外)。事件