您的位置:首页 > 移动开发 > Android开发

Android四大组件之一广播

2016-03-06 14:21 441 查看
广播接收者:系统在运行过程中,会产生会多事件,那么某些事件产生时,比如:电量改变、收发短信、拨打电话、屏幕解锁、开机,系统会发送广播,只要应用程序接收到这条广播,就知道系统发生了相应的事件,从而执行相应的代码。使用广播接收者,就可以收听广播。

一:创建广播接收者

1.定义一个Java类继承BroadcastReceiver

public class CallReceiver extends BroadcastReceiver {
//接受到广播时就会调用
@Override
public void onReceive(Context context, Intent intent) {
}
}


2.在AndroidManifest.xml文件中定义receiver节点,定义name属性,指定广播接收者Java类的全类名

<receiver android:name="com.lc.ip.CallReceiver"               <intent-filter >
<action    android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>


3.在intent-filter的节点中,指定action子节点,action的值必须跟要接受的广播中的action匹配。下面给出几个常见的action名称。

//拨打电话广播
android:name="android.intent.action.NEW_OUTGOING_CALL"
//接收短信广播
android:name="android.provider.Telephony.SMS_RECEIVED"
//开机广播
android:name="android.intent.action.BOOT_COMPLETED"


值得注意的是监听一些广播的时候,需要一定的权限。不同的广播相应的权限也不同。

二.广播的启动

1.4.0之前,广播接收者所在进程如果从来没启动过,那么广播接收者不会生效

2.4.0之后,如果系统自动关闭广播接收者所在进程,在广播中的action跟该广播接收者的action匹配时,系统会启动该广播接收者所在的进程,但是如果是用户手动关闭该进程,那么该进程会进入冻结状态,再也不会启动了,直到用户下一次手动启动该进程。

三.广播的分类

1.无序广播:所有与广播中的action匹配的广播接收者都可以收到这条广播,并且是没有先后顺序,视为同时收到。

2.有序广播:所有与广播中的action匹配的广播接收者都可以收到这条广播,但是是有先后顺序的,按照广播接收者的优先级排序。

*优先级的定义:-1000~1000

* 最终接收者:所有广播接收者都接收到广播之后,它才接收,并且一定会接收

* abortBroadCast:阻止其他接收者接收这条广播,类似拦截,只有有序广播可以被拦截

四.发送自定义广播

发送的广播action可以自行命名,但是接收者清单文件中的配置必须和其完全相同。发送广播的时候可以设置一个广播最终接收者,不管该广播中途是否被拦截,它都会收到广播。

简例说明:

//发送广播代码
public void click(View v){
//发送自定义广播
Intent intent = new Intent();
//广播的action自己定义
intent.setAction("com.lzz.lc");
sendBroadcast(intent);
/*resultRecevier:不需要在清单文件中配置,这个广播接受者只接受该条有序广播,并且是最后一个收到该广播,并且一定能够收到该广播 即便该广播被拦截
sendOrderedBroadcast(intent, null, new MyRecevier(), null, 0, "广播内容", null);
}*/
//上述代码中的MyRecevier()是自己定义的类,作为最终接收者,他同样继承于BroadcastReceiver。
}
//接收广播代码
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
String text = getResultData();
System.out.println("一级收到文件"+text);
//更改广播当中的内容,发送给比本身底优先级的广播接收者
setResultData("我是第一,你是第二");
}


短信防火墙代码实例

public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent intent) {
// TODO Auto-generated method stub
//拿到短信的內容,短信內容封裝在intent 中
Bundle bundle = intent.getExtras();
//以pdus位鍵,取出一个object数组,数组中的每一个元素都是一条短信
Object[] objects = (Object[]) bundle.get("pdus");

//拿到广播中的所有短信
for(Object object : objects){
//通过pdu来构建短信
SmsMessage sms = SmsMessage.createFromPdu((byte[]) object);
if(sms.getOriginatingAddress().equals("123456789")){
//拦截该短信
abortBroadcast();
//回复给拦截短信的人信息
SmsManager.getDefault().sendTextMessage(sms.getOriginatingAddress(), null, "自动回复消息", null, null);
}
}
}

}
//AndroidManifest.xml中配置
<receiver android:name="com.example.message_fire">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android