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

相关文章

以下为个人理解,如错请评 CE: 凭据加密 (CE) 存储空间, 实际路径/data/user_ce/ DE: 设备加密 (DE) 存...
转载来源:https://blog.csdn.net/yfbdxz/article/details/114702144 用EventLog.writeEvent打的日志(或...
事件分发机制详解 一、基础知识介绍 1、经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION...
又是好久没有写博客了,一直都比较忙,最近终于有时间沉淀和整理一下最近学到和解决的一些问题。 最近进...
Android性能优化——之控件的优化 前面讲了图像的优化,接下来分享一下控件的性能优化,这里主要是面向...
android的开源库是用来在android上显示gif图片的。我在网上查了一下,大家说这个框架写的不错,加载大的...