我知道這個問題已被多次詢問,但沒有人能夠拿出我所見過的工作答案。短信ContentObserver onChange()多次觸發
我正在一個應用程序攔截文本消息,並根據發送#,彈出一個自定義提醒。我用廣播接收機工作得很漂亮,但是如果用戶安裝了goSms,onReceive()
方法永遠不會被調用,因爲goSms會在它到達我的應用程序之前中止它。
爲了解決這個問題,我試着在content://sms/
其內容觀測工作得很好,但是onChange()
被調用兩次,具有完全相同的參數。我試圖檢查時間戳,但是它們是一樣的,就像我設置的類型和每個其他參數一樣。
從我所看到的情況來看,這是一個常見問題,但不是我見過的任何地方都能找到答案的問題。
@Override
public 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()
被激發兩次,我也得到兩個警報。我不能爲了我的生活找出解決辦法。
鏈接到其他(不完整)的答案將是有幫助的 – KevinDTimm 2012-02-02 19:19:29