上一节讲到,在数据库进行添加和删除,查询的操作,这一节主要讲怎么用广播和服务进行拦截
为了能够打开服务 让广播同时关闭,所以我们不能将广播在配置文件中进行注册,不好管理,所以我们将广播放在服务里面。先建立一个服务。
CallSmsSafeService.java
注意要在配置文件中注册。
在前面的文章中我提过,服务就是一个没有界面的activity,so 你要自己复写,Oncreate 和Ondestory 方法进行注册 和销毁 服务和广播。
//1.实例化出来 广播接收者
receiver = new InnerSmsReceiver();
//2.注册广播接受者
registerReceiver(receiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));
//3.销毁广播
<pre name="code" class="java">unregisterReceiver(receiver);
是不是发现和在配置文件中注册是一个步骤, 一个监听对象和一个 过滤器动作。
然后再我们自己定义的InnerSmsReceiver 写上我们要执行的操作
private class InnerSmsReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//检测到来短信是否是黑名单号码,设置短信拦截
Object[] objs= (Object[]) intent.getExtras().get("pdus");
for (Object obj : objs) {
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);
//得到短信发件人
String sender = smsMessage.getOriginatingAddress();
String mode = dao.findMode(sender);
if("2".equals(mode)||"3".equals(mode)){
abortBroadcast();
}
//演示代码。
String body = smsMessage.getMessageBody();
if(body.contains("fapiao")){
//你的头发票亮的很 语言分词技术。
abortBroadcast();
}
}
}
}
然后通过服务进行监听来电电话阶段
//①先得到电话的管理服务
tm= (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
//②进行注册监听和动作
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
//③定义一个服务监听来电
private class MyListener extends PhoneStateListener{@Overridepublic void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);switch (state) {case TelephonyManager.CALL_STATE_RINGING://零响状态。String result = dao.findMode(incomingNumber);if("1".equals(result)||"3".equals(result)){endCall();}break;default:break;}}}
然后通过aidl 进行挂断电话,因为从1.7版本以后 谷歌就把这个功能给隐藏掉了
public void endCall() {
//IBinder iBinder = ServiceManager.getService(TELEPHONY_SERVICE);
try {
//加载servicemanager的字节码
Class clazz = CallSmsSafeService.class.getClassLoader().loadClass("android.os.ServiceManager");
Method method = clazz.getDeclaredMethod("getService", String.class);
IBinder ibinder = (IBinder) method.invoke(null, TELEPHONY_SERVICE);
ITelephony.Stub.asInterface(ibinder).endCall();
} catch (Exception e) {
e.printStackTrace();
}
}
记得在Ondestory中销毁服务
tm.listen(listener, PhoneStateListener.LISTEN_NONE);
下一篇地址