2011-11-23 54 views
4

我已經定義了下面的服務與觀察者發送的消息。問題是,在發送消息時,我感覺這被稱爲onobhange方法的3倍內容服務器。 ¿有人知道告訴我爲什麼?短信發送觀察者執行3次

感謝

public class DSMSService extends Service { 
     private static final String CONTENT_SMS = "content://sms"; 

     private class MyContentObserver extends ContentObserver { 
      ContentValues values = new ContentValues(); 
      int threadId; 

      public MyContentObserver() { 
       super(null); 
      } 

      @Override 
      public void onChange(boolean selfChange) { 
       super.onChange(selfChange); 
       Log.v(TAG, "****************************** SMS change detected *************************************"); 
       Log.v(TAG, "Notification on SMS observer"); 
       // save the message to the SD card here 
       Uri uriSMSURI = Uri.parse("content://sms"); 
       Cursor cur = getBaseContext().getContentResolver().query(uriSMSURI, null, null, null, null); 
       // this will make it point to the first record, which is the last SMS sent 
       cur.moveToNext(); 
       String content = cur.getString(cur.getColumnIndex("body")); 

       Log.v(TAG, "content: " + content); 
      } 

      @Override 
      public boolean deliverSelfNotifications() { 
       return false; 
      } 
     } 

     @Override 
     public IBinder onBind(Intent intent) { 
      return null; 
     } 

     @Override 
     public void onCreate() { 
      Log.v(TAG, "starting........"); 
      MyContentObserver contentObserver = new MyContentObserver(); 
      ContentResolver contentResolver = getBaseContext().getContentResolver(); 
      contentResolver.registerContentObserver(Uri.parse("content://sms"),true, contentObserver); 
      DAO = new DAOaBlackList(getBaseContext()); 
     } 

     @Override 
     public void onDestroy() { 
      Log.d(TAG, "stopping........"); 
     } 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      Log.v(TAG, "Received start id " + startId + ": " + intent); 
      // We want this service to continue running until it is explicitly 
      // stopped, so return sticky. 
      return START_STICKY; 
     } 

     @Override 
     public void onStart(Intent intent, int startid) { 
      Log.v(TAG, "onStart........"); 
     } 
    } 
+0

這行代表什麼意思:DAO = new DAOaBlackList(getBaseContext()); ?? – Aexyn

回答

6

你想要做的是檢查的最後一個項目裏面的onChange的content://sms/sent URI的_id。在查詢content://sms/sent後,您需要存儲以前的_id(也許在一個靜態全局變量中)並將其與光標的最後一項(cursor.moveToLast())的_id進行比較。如果_id是相同的,您可以選擇忽略對onChange的調用。這多次調用onChange我相信是由於在發送 - 發件箱,發送項目,一些其他「隱形文件夾」(我們無法確切知道什麼,因爲這個特定的功能真的非常需要適當的文檔)。由於您不能聽到比content://sms/sent更具體的Uri,所以您必須在每次要檢測正在發送的短信時實施此檢查。

如果前面的_id與靜態全局變量中的不一樣,那麼您將發送一條短信。

3

您通過URI保留了SMS數據庫的Observer。所以無論何時發送消息,數據庫都會更新,並且該表的3列正在更新。所以它會通知他們每個人的觀察員。所以它被調用的次數與表數據的更新次數一樣多。