② 应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。
③ 广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
Android中的广播事件有两种,一种就是系统广播事件,比如:ACTION_BOOT_COMPLETED(系统启动完成后触发),ACTION_TIME_CHANGED(系统时间改变时触发),ACTION_BATTERY_LOW(电量低时触发)等等。另外一种是我们自定义的广播事件。
public class NetworkReceiver extends BroadcastReceiver
{@Overridepublic void onReceive(Context context, Intent intent){//TODO}
}
<receiver android:name="MyBroadcastReceiver"> <intent-filter android:priority="1000"> <action android:name=“" /></intent-filter>
</receiver>
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)
此种方式注册的广播接收者可以卸载:
public void unregisterReceiver(BroadcastReceiver receiver)
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
监听短信到来,需加上权限:
< uses-permission android:name = "android.permission.RECEIVE_SMS" />
public void sendBroadcast(Intent intent)
public void sendStickyBroadcast(Intent intent)
public void sendOrderedBroadcast(Intent intent, String receiverPermission)
public void sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver,Handler scheduler, int initialCode, String initialData,Bundle initialExtras)
package cn.edu.chd.broadcastreceiverdemo.receiver;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;public class SmsReceiver extends BroadcastReceiver
{@Overridepublic void onReceive(Context context, Intent intent){Toast.makeText(context, "短信来了啊...",1).show();}
}
清单文件:
<receiver android:name="cn.edu.chd.broadcastreceiverdemo.receiver.SmsReceiver"><intent-filter ><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>
权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
也可以通过Context的removeStickyBroadcast(Intent intent)接口移除缓存的粘性广播。
BroadcastReceiver的设计初衷就是从全局考虑的,可以方便应用程序和系统、应用程序之间、应用程序内的通信,所以对单个应用程序而言BroadcastReceiver是存在安全性问题的,相应问题及解决如下:
1.当应用程序发送某个广播时系统会将发送的Intent与系统中所有注册的BroadcastReceiver的IntentFilter进行匹配,若匹配成功则执行相应的onReceive函数。可以通过类似sendBroadcast(Intent, String)的接口在发送广播时指定接收者必须具备的permission。或通过Intent.setPackage设置广播仅对某个程序有效。
2. 当应用程序注册了某个广播时,即便设置了IntentFilter还是会接收到来自其他应用程序的广播进行匹配判断。对于动态注册的广播可以通过类似registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)的接口指定发送者必须具备的permission,对于静态注册的广播可以通过android:exported="false"属性表示接收者对外部应用程序不可用,即不接受来自外部的广播。
3.使用LocalBroadcastManager,这个类在support包中。使用方式如下:
注册广播:LocalBroadcastManager.getInstance(context).registerReceiver解除注册:LocalBroadcastManager.getInstance(context).unregisterReceiver发送广播:LocalBroadcastManager.getInstance(context).sendBroadcast(intent)