短信是記錄在系統本地的mmssms.db表中的 /data/com.android.providers.telephony/databases中。
Cursor mCursor =
managedQuery(Uri.parse("content://sms"),
new String[] {"_id,address,date,read,status,type,body,count(address) as "
+ "totleCount from (select _id,substr(address,4) as address,date,read,status,type,body "
+ "from sms where address like \"+86%\" union select _id,address,date,read,status,type,body "
+ "from sms where address not like \"+86%\") r group by r.address order by r.date desc --"},
null,
null,
null);
這種是拋遊標的方式,千萬要小心處理,onPause()和onDestroy()要及時的關閉。
if (null != mCursor && !mCursor.isClosed())
{
stopManagingCursor(mCursor);
}
顯示會話短信的Adapter可以使用ResourceCursorAdapter
public class FarmerAdapter extends ResourceCursorAdapter
{
private Context mContext;
public final class MessageHolder{
public ImageView img_icon;
public ImageView newSms;
public TextView nameTextView;
public TextView unreadCount;
public int count;
public TextView countTextView;
public TextView draft;
public TextView date;
public TextView message;
public String phoneNumber;
public String name;
public String id;}
public FarmerAdapter(Context context, int layout, Cursor c)
{
super(context, layout, c);
this.mContext = context;
}
@Override
public void bindView(View view, Context context, Cursor cursor)
{
/**
* 這邊是寫的一些邏輯代碼
*/
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent)
{
View view = super.newView(context, cursor, parent);
MessageHolder viewHolder = new MessageHolder();
viewHolder.img_icon = (ImageView)view.findViewById(R.id.sms_headImage);
viewHolder.nameTextView = (TextView)view.findViewById(R.id.name);
viewHolder.unreadCount = (TextView)view.findViewById(R.id.unread_count);
viewHolder.draft = (TextView)view.findViewById(R.id.draft);
viewHolder.countTextView = (TextView)view.findViewById(R.id.all_count);
viewHolder.date = (TextView)view.findViewById(R.id.date);
viewHolder.message = (TextView)view.findViewById(R.id.sms_content);
viewHolder.newSms = (ImageView)view.findViewById(R.id.newSms);
view.setTag(viewHolder);
return view;
}
@Override
public void changeCursor(Cursor cursor)
{
super.changeCursor(cursor);
}
}
可以自動的刷新界面,也可以手動刷新界面。當接收到短信時發送一個handler到短信顯示界面 進行刷新。