contentobserver 仅适用于插入和删除,但不适用于更新

Posted

技术标签:

【中文标题】contentobserver 仅适用于插入和删除,但不适用于更新【英文标题】:contentobserver works only for insert and delete but not for an update 【发布时间】:2014-07-05 22:22:54 【问题描述】:

我正在开发一个应用程序,当任何短信标记为已读时通知用户,即使应用程序没有运行

我只是创建了一个 contentobserver 并在服务中注册了它

问题是,如果插入或删除了新的 SMS,则 contentobserver 会运行,但是当 SMS 标记为已读(更新操作)时它不起作用

这是我的服务代码

    public class Smssendservice extends Service 

    private static Timer timer = new Timer();
    private Context ctx;

    public IBinder onBind(Intent arg0)
    
        return null;
    

    public void onCreate()
    
        super.onCreate();
        ctx = this;
        startService();
    

    private void startService()
    
        //timer.scheduleAtFixedRate(new mainTask(), 0, 5000);
        Toast.makeText(getApplicationContext(), "Before Register", Toast.LENGTH_SHORT).show();
        final Uri SMS_STATUS_URI = Uri.parse("content://sms");
        SMSLogger sl= new SMSLogger();

        SMSObserver smsSentObserver = new SMSObserver(sl, ctx);
        getContentResolver().registerContentObserver(SMS_STATUS_URI, true, smsSentObserver);
        Toast.makeText(getApplicationContext(), "After Register", Toast.LENGTH_SHORT).show();
    

我正在服务中注册我的内容观察者

这里是内容观察者代码

public class SMSObserver extends ContentObserver

    SMSLogger smsLogger;
    Context context;

    public SMSObserver(SMSLogger smsLogger, Context context) 

        super(new Handler());
        this.context=context;
        this.smsLogger = smsLogger;
    

    @Override
    public void onChange(boolean selfChange) 

        super.onChange(selfChange);
        smsLogger.querySMS(context);
    
 

最后这里是 SMS 记录器,如果 SMS 数据发生更改,我会显示 TOAST

public class SMSLogger 
    protected void querySMS(Context context) 
        Uri uriSMS = Uri.parse("content://sms/");
        Cursor cur = context.getContentResolver().query(uriSMS, null, null, null, null);
       /* cur.moveToNext(); // this will make it point to the first record, which is the last SMS sent
        String body = cur.getString(cur.getColumnIndex("body")); //content of sms
        String add = cur.getString(cur.getColumnIndex("address")); //phone num
        String time = cur.getString(cur.getColumnIndex("date")); //date
        String protocol = cur.getString(cur.getColumnIndex("protocol")); //protocol*/

        Toast.makeText(context, "Data Changed CHECK SMS" , Toast.LENGTH_SHORT).show();

    /*logging action HERE...*/
    

如果插入新短信或删除短信,它会显示此消息“数据已更改检查短信”,但在更新的情况下,吐司不会出现。有什么线索吗?

【问题讨论】:

应该“content://sms”通知这样的更新吗?你在哪里读到的? 它听插入和删除为什么它不听更新呢?知道如何收听更新动作吗?我应该使用短信/收件箱吗? 见developer.android.com/reference/android/provider/… 我有一个问题,如果我们从一个线程中删除多条消息,将能够收到删除特定消息的通知吗?我正在解决给定的问题,但无法得出结论。 【参考方案1】:

在您的更新方法中,检查更新的条目数是否大于 0。 如果是,请执行 getContext().getContentResolver().notifyChange(uri, null);在您返回更新的条目数之前。

【讨论】:

以上是关于contentobserver 仅适用于插入和删除,但不适用于更新的主要内容,如果未能解决你的问题,请参考以下文章

删除消息命令,仅适用于所有者、管理员和版主

剑道网格在插入期间启用编辑,在编辑期间禁用(仅适用于一列)

天蓝色推送通知是不是仅适用于从客户端完成的操作?

jquery droppable 仅适用于宽度的前 50%(错误??)

MySQL:错误 1217 (23000):无法删除或更新父行:外键约束失败 - 但仅适用于 1 个 sql 文件

为啥 SVG 视图框属性仅适用于内联 SVG?