android – Content Observer的onChange方法触发多次

我知道你很想把它标记为重复但等等,让我再次通过我的详细(但失败)尝试再次讨论这个问题.

策略1:算法:Answer

  1. The first time the onChange is fired,get the id of the row updated

  2. The next time the onChange is fired again get id of row updated

  3. Match the id

  4. Ignore if same id

这种方法的问题在于它很容易受到竞争条件的影响.如果在获得更新行的id时,onChange第二次触发,则此算法失败.这源于我在慢速机器或以峰值容量工作的机器上进行测试时的个人经验.

策略2:算法:Answer

Override deliverSelfNotifications() to return true.

这开始看起来很有希望,但没有奏效.
我用来参考的代码

在主要活动:OnCreate方法注册

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与所有已处理的消息进行比较,而不仅仅是最后一个消息,从而消除您所述的问题.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...