我知道你很想把它标记为重复但等等,让我再次通过我的详细(但失败)尝试再次讨论这个问题.
策略1:算法: 答案
第一次触发onChange时,更新行的id
下次再次触发onChange时,会更新行的id
匹配id
忽略相同的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事件的唯一方法.但到目前为止,我还没有找到任何令人信服的完整功能的答案.所以我们真的需要对此有所了解!! …
sms android onchange android-contentprovider contentobserver
我知道这个问题已被多次询问,但没有人能够从我所看到的那里得到一个有效的答案.
我正在开发一个应用程序拦截短信,并根据发送#,弹出一个自定义提醒.我让它与广播接收器完美配合,但是如果用户安装了goSms,那么onReceive()方法永远不会被调用,因为goSms在它到达我的应用程序之前就会中止它.
为了解决这个问题,我尝试了一个关于content://sms/
它的内容观察者工作得很好,但是它onChange()被调用两次,具有完全相同的参数.我试过检查时间戳,但它们是相同的,就像我设置的类型和其他所有参数一样.
从我所看到的情况来看,这是一个常见的问题,但不是我见过的任何一个问题.
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
querySMS();
}
protected void querySMS() {
Cursor cur = getContentResolver().query(u, null, null, null, null);
cur.moveToNext(); // this will make it point to the first record, which is the last SMS sent
String type = cur.getString(cur.getColumnIndex("type"));
String body = cur.getString(cur.getColumnIndex("body")); //content of sms
String add = cur.getString(cur.getColumnIndex("address")); //phone num
if (type.equals("1")) {
if (add.equals(Test.SENDER)) {
String[] bodys = body.split(" ", 7);
if (bodys[0].equals("test")) { …Run Code Online (Sandbox Code Playgroud) 我实现了历史的内容观察者,但它表现得很奇怪.对于历史中的每个变化,它的onChange()函数运行3-5次.
static class BrowserOberser extends ContentObserver {
public BrowserOberser() {
super(null);
}
@Override
public boolean deliverSelfNotifications() {
return true;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.d("History", "onChange: " + selfChange);
}
}
Run Code Online (Sandbox Code Playgroud)
我也用我的观察员注册了
BrowserOberser observer = new BrowserOberser();
getApplication().getContentResolver().registerContentObserver(Browser.BOOKMARKS_URI, true, observer );
Run Code Online (Sandbox Code Playgroud)
并在清单中添加了所需的权限.
代码工作正常,但onChange(); 每次历史变化都会运行3-5次
任何人都可以帮我解决这个问题吗?