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

时间:2015-03-19 19:05:47

标签: android sms android-contentprovider onchange contentobserver

我知道你很想把它标记为副本但等等,让我再次通过我的详细(但失败)尝试再次进行此操作。

策略1:算法: Answer

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

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

  4.   
  5. 匹配ID

  6.   
  7. 如果ID相同则忽略

  8.   

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

策略2:算法: Answer

  

覆盖deliverSelfNotifications()以返回true。

这一开始似乎很有希望,但没有奏效。 我用来参考的代码:

在主要活动中:OnCreate方法I注册:

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");
}
}

为什么你应该为这个答案做出贡献:
Quering SMS内容提供商是非默认应用捕获 已发送短信的唯一方式。但到目前为止,我还没有找到任何令人信服的完整功能的答案。所以我们真的需要对此有所了解!!

问题:

  1. 简单地知道SMS只被写入内容提供商一次的功能(非调整)方式是什么?
  2. 在Content Observer Class中使用deliverSelfNotifications()的正确方法是什么?
  3. 您无需回答所有问题,只需告诉我们您知道的任何问题。

1 个答案:

答案 0 :(得分:2)

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

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

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