内容观察者的onChange方法触发了多次

Dil*_*ngh 9 sms android onchange android-contentprovider contentobserver

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

策略1:算法: 答案

  1. 第一次触发onChange时,更新行的id

  2. 下次再次触发onChange时,会更新行的id

  3. 匹配id

  4. 忽略相同的id

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

策略2:算法:答案

覆盖deliverSelfNotifications()以返回true.

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

在主要活动:OnCreate方法我注册:

getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, new CtObserver(new Handler()));
Run Code Online (Sandbox Code Playgroud)

然后在一个单独的类中:

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");
}
}
Run Code Online (Sandbox Code Playgroud)

为什么您应该为此答案做出贡献:
Quering SMS content Provider是非默认应用程序捕获发送SMS事件的唯一方法.但到目前为止,我还没有找到任何令人信服的完整功能的答案.所以我们真的需要对此有所了解!!

问题:

  1. 简单地知道SMS只被写入Content Provider一次的功能(非调整)方式是什么?
  2. 在Content Observer Class中使用deliverSelfNotifications()的正确方法是什么?

您无需回答所有问题,只需告诉我们您所知道的任何问题.

wea*_*ase 2

deliverSelfNotifications()最有可能旨在将数据更改与表示更改分开。例如,内容可以在您的应用程序中进行排序,但外部应用程序不需要仅仅因为数据已排序就再次获取数据,因为大多数时候这是无关紧要的(该应用程序可能无论如何都使用不同的演示文稿)。换句话说 - 此方法控制您是否希望接收提供者本身对内容所做的更改,这可能会也可能不会以对您的应用程序有意义的方式实际反映数据更改。

为了使用它,您需要一个ContentObservable利用自我更改通知的实现。

对于另一个问题,我想建议HashSet存储消息 ID。有了它,您可以将消息 ID 与所有曾经处理过的消息进行比较,而不仅仅是最后一条消息,从而消除您所说的问题。