我知道这个问题已被多次询问,但没有人能够从我所看到的那里得到一个有效的答案.
我正在开发一个应用程序拦截短信,并根据发送#,弹出一个自定义提醒.我使用广播接收器可以很好地工作,但是如果用户安装了goSms,则永远不会调用onReceive()方法,因为goSms在到达我的应用程序之前就会中止它.
为了解决这个问题,我在内容上尝试了内容观察者:// sms /
它的工作正常,但onChange()被调用两次,参数完全相同.我曾尝试检查时间戳,但它们是相同的,我设置的类型和其他参数也是如此.
从我所看到的情况来看,这是一个常见的问题,但不是我见过的任何一个问题.
@Override public void onChange(boolean selfChange) { super.onChange(selfChange); querySMS(); } protected void querySMS() { Cursor cur = getContentResolver().query(u,null,null); cur.moveToNext(); // this will make it point to the first record,which is the last SMS sent String type = cur.getString(cur.getColumnIndex("type")); String body = cur.getString(cur.getColumnIndex("body")); //content of sms String add = cur.getString(cur.getColumnIndex("address")); //phone num if (type.equals("1")) { if (add.equals(Test.SENDER)) { String[] bodys = body.split(" ",7); if (bodys[0].equals("test")) { test = true; } cat = bodys[1]; level = bodys[2]; urgency = bodys[3]; certainty = bodys[4]; carrier = bodys[5]; message = bodys[6]; final Intent intent = new Intent(context,AlertActivity.class); Bundle b = new Bundle(); b.putString("title",cat); b.putString("certainty",certainty); b.putString("urgency",urgency); b.putString("level",level); b.putString("message",message); b.putBoolean("test",test); intent.putExtras(b); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); carrierName = manager.getNetworkOperatorName(); if (carrierName.replaceAll(" ","").equals(carrier)) { context.startActivity(intent); } else { //testing Toast.makeText(context,carrierName.replaceAll(" ",""),Toast.LENGTH_LONG).show(); } } } }
解决方法
如果两者相同:
存储收到的每条消息
将它与之前收到的消息进行比较
如果没有找到,请处理
如果找到,请丢弃该消息
存储收到的每条消息
将它与之前收到的消息进行比较
如果没有找到,请处理
如果找到,请丢弃该消息
存储的消息的生命周期应该是无穷小的,5个消息的小循环缓冲区应该没问题.