广播接收者-(BroadcastReceiver)用于接收广播Intent,
广播Intent的发送时通过调用 Context.sendBroadcast();Context.sendOrderedBroadcast()l实现的。
通常一个intent可以被订阅了此intent的多个广播接收者所接收,实现如下:
1.继承BroadcastReceiver 重写onReceive()方法;
2.订阅感兴趣的广播intent,
IntentFilter filter = new IntentFilter ("广播类型");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReciver(receiver,filter ); //注册
3.普通广播 Normal broadcasts 完全异步,,可以被所有接收者接收到 ,缺点:不能将处理结果传递给下一个广播接收者
Context.sendBroadcast(new intent对象);
有序广播 ordered broadcast 根据接收者声明的优先级别 依次接收 A-B-C-D...有序广播接收者可以终止广播传递
Context.sendOrderedBroadcast();
arg0:广播对象,广播意图
arg1:接收该广播的权限
arg2:必须接收该广播的接收者,拦截置空,达到不允许拨特定号码
arg3:hanndle,置空将在Context所在的主线程被调用
arg4:用于标识结果数据的结果码
arg5:为结果数据(拨号号码)
arg6:附加的广播额外数据
终止广播-
abortBroadcast();
实例:广播接收者实现短信监听-BroadcastReceiver
原理:系统接收短信时,发送一个广播intent:android.provider.Telephony.SMS_RECEIVED;该intent包含短信内容,
我们使用“pdus”接收intent中短信数据
package com.example.smslistener;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
/**
* 广播接收者
* @author Administrator
*
*/
public class UnSortBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent intent) {
Log.e("Intent_Action:::",intent.getAction()+"");
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for(Object obj:pdus){
byte[] pdu = (byte[]) obj;
SmsMessage message = SmsMessage.createFromPdu(pdu);
String content = message.getMessageBody();
Date date = new Date(message.getTimestampMillis());
//YY-MM-dd HH:mm:ss
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String receiverTime = format.format(date);
//send number
String sendNumber = message.getOriginatingAddress();
//网络发送短信内容
//sendSMS(content,receiverTime,sendNumber);
System.out.println("sendNumber"+sendNumber);
System.out.println("reciverTime:"+receiverTime);
System.out.println("content:"+content);
}
}
/**
* 接收短信权限
* 访问网络权限
* <uses-permission android:name="android.permission.RECEIVE_SMS" />
* <uses-permission android:name="android.permission.INTERNET"/>
*
* @param content
* @param receiverTime
* @param sendNumber
* @return
*/
private boolean sendSMS(String content, String receiverTime, String sendNumber) {
try{
//2.2
String params = "content = "+URLEncoder.encode(content,"UTF-8")+
"&receivertime = "+receiverTime+
"&sendnumber = "+sendNumber;
byte[] entity = params.getBytes();
//1.
String path = "http://192.168.1.100:80/videonews/ReceiveSMSServlet";
//2.1
HttpURLConnection conn = (HttpURLConnection)new URL(path).openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", String.valueOf(entity.length));
conn.getOutputStream().write(entity);
if(conn.getResponseCode() == 200){
return true;
}
}catch(Exception e){
e.printStackTrace();
}
return false;
}
}
主配置文件
<receiver android:name=".UnSortBroadcastReceiver">
<!-- priority权限等级 -1000-1000 -->
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
-----------------------------外拨电话限制
package com.example.smslistener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
/**
* 1.获取拨号广播-权限要求大于发送广播者权限
* 2.修改拨号号码(加上亲情号-便宜)
* 3.从新设置广播
* @author Administrator
*
*/
public class PhoneBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
String phoneNumber = getResultData();
if("10086".equals(phoneNumber)){
setResultData(null);
//abortBroadcast();//sendOrderedBroadcast()发送广播时指定了拨号器接收者,这里不能抛弃
}else{
phoneNumber = "12593"+phoneNumber;
setResultData(phoneNumber);
}
}
}
参考文章:http://blog.youkuaiyun.com/jiangwei0910410003/article/details/19150705