SMS 发送观察者执行 3 次

Posted

技术标签:

【中文标题】SMS 发送观察者执行 3 次【英文标题】:SMS sent observer executes 3 times 【发布时间】:2012-01-04 13:22:24 【问题描述】:

我已经定义了以下服务,其中包含发送消息的观察者。问题是在发送消息时,我感觉它被调用了 3 次 contentobserver 的 onChange 方法。 ¿ 有人知道告诉我为什么吗?

谢谢

    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........");
        
    

【问题讨论】:

这行是什么意思:DAO = new DAOaBlackList(getBaseContext()); ?? 【参考方案1】:

您要做的是检查 onChange 内 content://sms/sent uri 中最后一项的 _id。在查询content://sms/sent 后,您需要存储之前的_id(可能在静态全局变量中)并将其与游标的最后一项(cursor.moveToLast())的_id 进行比较。如果_id相同,可以选择忽略对onChange的调用。我相信这对 onChange 的多次调用是由于在发送过程中短信从一个文件夹移动到另一个文件夹 - 发件箱、已发送的项目、其他一些“不可见的文件夹”(我们无法确切知道是什么,因为这个特殊的功能真的真的需要适当的文档)。由于您无法收听比 content://sms/sent 更具体的 Uri,因此您必须在每次要检测正在发送的短信时对 _id 进行此检查。

如果之前的_id 与您的静态全局变量中的不同,那么您正在发送一条短信。

【讨论】:

【参考方案2】:

您已通过 URI 为 SMS 数据库保留了观察者。因此,每当发送消息时,数据库都会更新,并且该表的 3 列正在更新。所以它会通知他们每个人的观察者。所以它被调用的次数与表数据更新的次数一样多。

【讨论】:

以上是关于SMS 发送观察者执行 3 次的主要内容,如果未能解决你的问题,请参考以下文章

观察者模式和发布订阅模式

Kotlin RX .zipWith 函数体每个观察者执行一次还是一次?

Android - 查询 SMS ContentProvider?

内容观察者

行为型模式--观察者模式

WebRTC 源码分析之一:几个核心设计概念