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

时间:2014-05-17 14:50:05

标签: android service sms contentobserver

我正在开发一个应用程序,当任何标记为已读取的短信时,即使应用未运行

,也会通知用户

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

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

这是我的服务代码

    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...*/
    }
}

如果插入新短信或短信删除,则会显示此消息“数据已更改CHECK SMS”,但如果更新,则不显示吐司。任何线索?

1 个答案:

答案 0 :(得分:1)

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