1、IP拨号器 --> 自动加一个IP前缀,打电话更便宜【具体过程:系统拨打号码时(即点击拨打按钮,此时在拨号器界面),会发出一个广播,广播中会携带拨打的号码,注册广播接收者(即打电话的应用)接收这个广播,取出这个号码,修改这个号码,然后把修改后的号码重新放入广播】
广播定义方式
1> 定义一个类继承BroadcastReceiver
2> 在清单文件中配置该类,指定接收的广播种类【用intent-filter来指定】
3> 广播是通过intent发送的,intent中会携带一个action,系统会在所有清单文件中寻找,看哪一个广播接收者的intent-filter和广播中的intent是匹配的,那么这个广播接收者就会收到这条广播
4> 具体实现
public void onReceive(Context context, Intent intent) {
//取出广播中的号码
String number = getResultData();
//修改广播中的号码
String newNum = "17951" + number;
setResultData(newNum);
System.out.println("拨号器收到广播了...");
}
2、短信防火墙
<1> 原理
<2> 实现过程:
1> 在intent-filter中添加Action,此Action被Google屏蔽了,只能手动输入——android.provider.Telephony.SMS_RECEIVED
2> 设置权限 —— android.permission.RECEIVE_SMS
3> 设置优先级,这样才能拦截短信 —— android:priority="1000",数字越大,优先级越高,这里已经比Google自带的大了
4> 代码实现
public void onReceive(Context context, Intent intent) {
//短信的内容是封装在Bundle中的
Bundle bundle = intent.getExtras();
//数组中的每一个元素都是一条短信
Object[] objects = (Object[]) bundle.get("pdus");
for (Object object : objects) {
//把数组中的元素转换成短信对象
SmsMessage sms = SmsMessage.createFromPdu((byte[]) object);
//获取对方号码
String address = sms.getOriginatingAddress();
//获取短信内容
String body = sms.getMessageBody();
System.out.println(address + ": " + body);
if("123".equals(address)){ //拦截条件
//拦截短信
abortBroadcast();
}
}
}
3、特别注意
4.0之后,广播接收者所在的应用必须启动过一次,才能生效
4.0之后,如果广播接收者所在应用被用户手动关闭了,那么再也不会启动了,直到用户再次手动启动该应用,系统自动杀死的话,就可以启动
如果不想让别人看到拦截程序图标【但进程中还是可以看到】的话,可以删掉Manifest中的入口配置———— android.intent.action.MAIN,但由于上面两个条件的限制,这样做是不行的,只能按以下步骤做-------- 先下载启动一次,然后删掉Manifest中的入口配置———— android.intent.action.MAIN,再下载一次(此时认为是更新,就不用再启动了),就可以进行拦截了。