Sms ContentObserver onChange()触发多次
我知道这个问题已经被问过多次了,但是没有人能够从我所看到的问题中得出一个可行的答案。
我正在开发一个应用程序以拦截短信,并根据发送的#弹出自定义提醒。我让它与广播接收器完美配合,但是,如果用户安装了goSms,onReceive()
则永远不会调用该方法,因为goSms在它到达我的应用程序之前会中止它。
为了解决这个问题,我尝试在内容观察器上content://sms/
正常工作,但是onChange()
使用相同的参数调用了两次。香港专业教育学院试图检查时间戳,但它们是一样的,类型和我设置的每个其他参数也一样。
从我所看到的情况来看,这是一个普遍的问题,但是我所见的任何地方都没有。
@Overridepublic void onChange(boolean selfChange) {
super.onChange(selfChange);
querySMS();
}
protected void querySMS() {
Cursor cur = getContentResolver().query(u, null, null, 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();
}
}
}
}
由于onChange()
被解雇了两次,我也收到了两个警报。我无法为自己的生活找到解决此问题的方法。
回答:
如果两者相同:
将收到的每条消息与收到的每条消息
进行比较,
如果未找到,则进行处理,
如果找到,则将其丢弃
存储的消息的寿命应该是无限的,应该有5条消息的循环缓冲区。
以上是 Sms ContentObserver onChange()触发多次 的全部内容, 来源链接: utcz.com/qa/421806.html