5

送信されたメッセージのオブザーバーを使用して、次のサービスを定義しました。問題は、メッセージを送信するときに contentobserver の onChange メソッドが 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........");
        }
    }
4

2 に答える 2

8

あなたがしたいことは、onChange 内の uri_idの最後の項目をチェックすることです。content://sms/sent以前の _id を (おそらく静的グローバル変数に) 格納し、cursor.moveToLast()をクエリした後、カーソルの最後の項目 ( ) の_id と比較する必要がありますcontent://sms/sent。同じ場合_idは、onChange の呼び出しを無視することを選択できます。この onChange への複数回の呼び出しは、送信中に SMS がフォルダーからフォルダーに移動したためだと思われます - 送信トレイ、送信済みアイテム、その他の「非表示フォルダー」(この特定の機能には本当に本当に適切な必要があるため、正確にはわかりません)ドキュメンテーション)。より具体的な Uri を聞くことはできないcontent://sms/sentため、送信されている SMS を検出するたびに _id のこのチェックを実装する必要があります。

以前の_id値が静的グローバル変数のものと異なる場合は、SMS が送信されています。

于 2011-11-23T12:20:35.587 に答える
4

URI を介して SMS データベースのオブザーバーを保持しています。したがって、メッセージが送信されるたびにデータベースが更新され、そのテーブルの列の 3 つが更新されます。そのため、それぞれのオブザーバーに通知します。そのため、テーブル データが更新されるたびに呼び出されます。

于 2011-11-23T12:24:01.990 に答える