1. 注册ContentObserver时Sms.Inbox.CONTENT_URI应改成Sms.CONTENT_URI.

getContentResolver().registerContentObserver(Sms.Inbox.CONTENT_URI,
        true, mInboxObserver);

此时Uri是Sms.Inbox.CONTENT_URI,它并没有表示一张表。我将它理解为Sms.CONTENT_URI的一个视图。

getContentResolver().registerContentObserver(Sms.CONTENT_URI,
        true, mInboxObserver);

2. 在使用getContentResolver().update()方法时必须设置selection参数。

如果selection为null,表示Uri表示的所有数据都在update的范围之中。

如果Uri表示某一张表,比如Sms.CONTENT_URI表示Sms表,如果没有设定selection,那么将修改Sms表中所有数据,造成低级但严重错误。

private ContentObserver mInboxObserver = new ContentObserver(null) {
    public void onChange(boolean selfChange) {
        Cursor cursor = getContentResolver().query(Sms.Inbox.CONTENT_URI,
                new String[]{Sms._ID, Sms.THREAD_ID, Sms.TYPE, Sms.BODY, Sms.DATE, Sms.READ},
                "type = " + Sms.MESSAGE_TYPE_INBOX + " and read = 0 and thread_id = " + getOrCreateThreadId(),
                null, null);
        TxrjMessage msg = null;
        if(cursor != null) {
            if(cursor.moveToFirst()) {
                msg = new TxrjMessage();
                msg.setMessageId(cursor.getInt(cursor.getColumnIndex(Sms._ID)));
                msg.setThreadId(cursor.getInt(cursor.getColumnIndex(Sms.THREAD_ID)));
                msg.setType(cursor.getInt(cursor.getColumnIndex(Sms.TYPE)));
                msg.setBody(cursor.getString(cursor.getColumnIndex(Sms.BODY)));
                msg.setTime(cursor.getLong(cursor.getColumnIndex(Sms.DATE)));
                mMessages.add(msg);
                mHandler.sendMessage(mHandler.obtainMessage()); // 在优化过程中会改掉。
            }
            cursor.close();
        }
        if(msg != null) {
            ContentValues values = new ContentValues();
           
values.put(Sms._ID, msg.getMessageId()); // Bug语句。
            values.put(Sms.READ, 1);
            getContentResolver().update(Sms.Inbox.CONTENT_URI, values, null, null); // selection为null是个bug。
        }
    }
};

3. 在onChange()方法中使用Handler,使程序在主线程中更新UI,

onChange()方法是否在主线程中执行,有待确定。

private Handler mHandler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        mListAdapter.notifyDataSetChanged();
        mListView.setSelection(mListView.getBottom());
    }
};

4. 在会话列表界面中,点击某个会话打开信息列表界面之前将此会话中的未读信息改为已读。

在ConversationListActivity中点击某个item时首先执行

if(thread.getUnReadCount()>0) {
    ContentValues values = new ContentValues();
    values.put(Sms.READ, 1);
    getContentResolver().update(Sms.Inbox.CONTENT_URI, values,
            "read=0 and thread_>    getContentResolver().update(uri, values, null, null);

}

相关文章:

  • 2021-09-12
  • 2022-12-23
  • 2021-06-18
  • 2022-12-23
  • 2021-07-13
  • 2022-02-28
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-07-31
  • 2021-08-23
  • 2021-11-24
  • 2022-12-23
  • 2021-06-06
  • 2021-07-06
相关资源
相似解决方案