【问题标题】:Content Observer's onChange Method fired multiple TimesContent Observer 的 onChange 方法多次触发
【发布时间】:2015-05-23 01:29:00
【问题描述】:

我知道您很想将其标记为重复,但请稍等,让我们用我详细的(但失败的)尝试再过一遍。

策略 1:算法: Answer

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

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

  3. 匹配id

  4. 如果 id 相同则忽略

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

策略2:算法:Answer

重写 DeliverSelfNotifications() 以返回 true。

起初这似乎很有希望,但没有奏效。 我用作参考的代码:

在 Main Activity: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 内容提供程序是非默认应用程序捕获发送短信。但到目前为止,我还没有为这种方法找到任何令人信服的功能齐全的答案。所以我们真的需要对此有所了解!。

问题:

  1. 简单地知道 SMS 仅写入内容提供程序一次的功能(未调整)方法是什么?
  2. 在 Content Observer 类中使用 DeliverSelfNotifications() 的正确方法是什么?

您不需要回答所有问题,只要告诉我们您知道的任何事情。

【问题讨论】:

    标签: android sms android-contentprovider onchange contentobserver


    【解决方案1】:

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

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

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

    【讨论】:

    • 短信 ID 不是唯一的,在大多数应用程序上删除最后一条消息时它们会递减。
    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多