我知道你很想把它标记为重复但等等,让我再次通过我的详细(但失败)尝试再次讨论这个问题.
策略1:算法:Answer
这种方法的问题在于它很容易受到竞争条件的影响.如果在获得更新行的id时,onChange第二次触发,则此算法失败.这源于我在慢速机器或以峰值容量工作的机器上进行测试时的个人经验.
策略2:算法:Answer
Override deliverSelfNotifications() to return true.
这开始看起来很有希望,但没有奏效.
我用来参考的代码:
getContentResolver().registerContentObserver(Uri.parse("content://sms"),true,new CtObserver(new Handler()));
然后在一个单独的类中:
package com.example.testproject; import android.database.ContentObserver; import android.os.Handler; import android.util.Log; /** * @author Time Traveller */ public class CtObserver extends ContentObserver { public CtObserver(Handler handler) { super(handler); } public boolean deliverSelfNotifications(){ return true; } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Log.e("onChange","Fired"); } }
为什么你应该为这个答案做出贡献:
查询短信内容提供商是非默认应用程序捕获已发送短信事件的唯一方法.但到目前为止,我还没有找到任何令人信服的完整功能的答案.所以我们真的需要对此有所了解!!
问题:
>简单地知道SMS只被写入Content Provider一次的功能(非调整)方式是什么?
>在Content Observer Class中使用deliverSelfNotifications()的正确方法是什么?
您无需回答所有问题,只需告诉我们您所知道的任何问题.
解决方法
deliverSelfNotifications()最有可能旨在将数据更改与表示更改分开.例如,内容可以在您的应用程序中进行排序,但不需要外部应用程序再次获取数据,因为它已经排序,因为大多数时候这将是无关紧要的(该应用程序可能使用不同的演示文稿).换句话说 – 此方法控制是否要接收提供程序本身对内容所做的更改,这些更改可能会或可能不会实际反映对您的应用程序方式有意义的数据更改.
为了使用它,您需要一个使用自我更改通知的ContentObservable实现.
对于另一个问题,我想建议使用HashSet来存储消息ID.有了它,您可以将消息的ID与所有已处理的消息进行比较,而不仅仅是最后一个消息,从而消除您所述的问题.