短信模块的路径packages/apps/Mms包括短信和彩信。找到AndroidManifest.xml搜索“.MAIN”
找得到同时有
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
(包含这两个属性的activity都会在主菜单上创建快捷图标)
两个属性的filter,如:
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.DEFAULT" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
然后找到包含这个filter的 activity ”.ui.ConversationList”,按ctrl+shift+R搜索文件ConversationList.java这样就找到点击短信的第一个activity。
短信列表条数超过一屏时,点击进入查看界面再退出时,列表显示的第一条重新变为了零。
修改用到的函数:
ListView:
getFirstVisiblePosition()获取第一项的位置;
getChildAt(0).getTop() 获取第一项的顶点坐标;
setSelectionFromTop(pos,topoffset) 设置listview的位置,第一个参数是列表中第一项的位置,第二个参数是第一项的顶点坐标。
通过这个三个函数可以在listview失去焦点后保存listview的位置状态,在获得焦点时还原。
代码中的实现:
首先定义两个变量用来保存离开列表界面时的第一项位置和偏移量(第一项y坐标相对与0的偏移量)
private intcurListPos = 0;
private inttopOffset = 0;
在点击选项的时候保存这两个值:
protected void onListItemClick(ListView l, View v, int position, long id){
if (position == 0) {
…………………………
curListPos = 0;
topOffset = 0;
} else {
…………………………
curListPos =listView.getFirstVisiblePosition();
topOffset =listView.getChildAt(0).getTop();
}
}
在重回列表的时候设置listview的值:
这个函数会在异步查询线程mQueryHandler查询完成的时候调用
protectedvoid onQueryComplete(int token, Object cookie, Cursor cursor) {
switch (token) {
case THREAD_LIST_QUERY_TOKEN:
mListAdapter.changeCursor(cursor);
if(listView != null &&curListPos < listView.getCount()){
listView.setSelectionFromTop(curListPos,topOffset);
}
……………………
}
把短信上限数量改小,回到列表界面,显示的条数没有刷新(之前没超出上限的现在超出了但是列表没更新)
用到的函数:
是否设置了自动删除
Recycler.isAutoDeleteEnabled(ConversationList.this)
删除多出的彩信
Recycler.getMmsRecycler().deleteOldMessagesByThreadId(getApplicationContext(),cursor.getLong(thread_index));
删除多出的短信
Recycler.getSmsRecycler().deleteOldMessagesByThreadId(getApplicationContext(),cursor.getLong(thread_index));
代码实现:
定义变量用于保存短信和彩信的上限减少的状态
private static int limitHasDecrescent = 0;
public static final intSMS_HAS_DECRESCENT_FLAG = 1;
public static final intMMS_HAS_DECRESCENT_FLAG = 2;
定义设置状态的函数
publicstatic void setLimitHasDecrescent(int smsFlag,int mmsFlag){
limitHasDecrescent |= smsFlag | mmsFlag;
}
在设置上限是设置状态
文件MessageingPreferenceActivity.java
NumberPickerDialog.OnNumberSetListenermSmsLimitListener =
new NumberPickerDialog.OnNumberSetListener() {
public void onNumberSet(int limit) {
if(limit<mSmsRecycler.getMessageLimit(MessagingPreferenceActivity.this))
{
ConversationList.setLimitHasDecrescent(ConversationList.SMS_HAS_DECRESCENT_FLAG,0);
}
……………………
}
};
NumberPickerDialog.OnNumberSetListener mMmsLimitListener =
new NumberPickerDialog.OnNumberSetListener() {
public void onNumberSet(intlimit)
{
if(limit<mMmsRecycler.getMessageLimit(MessagingPreferenceActivity.this)){
ConversationList.setLimitHasDecrescent(0,ConversationList.MMS_HAS_DECRESCENT_FLAG);
}
……………………
}
};
在回到列表时刷新:
这个函数会在异步查询线程mQueryHandler查询完成的时候调用
protected voidonQueryComplete(int token, Object cookie, Cursor cursor) {
switch (token) {
case THREAD_LIST_QUERY_TOKEN:
mListAdapter.changeCursor(cursor);
if(limitHasDecrescent> 0 && Recycler.isAutoDeleteEnabled(ConversationList.this)){
while(cursor.moveToNext()){
//获得会话在数据库中的ID
intthread_index = cursor.getColumnIndex(Threads._ID);
//是否含有附件 ,用来判断是否是彩信
inthas_att_index = cursor.getColumnIndex(Threads.HAS_ATTACHMENT);
if(-1 !=thread_index && -1 != has_att_index){
//删除彩信
if(cursor.getInt(has_att_index)> 0 && (limitHasDecrescent & MMS_HAS_DECRESCENT_FLAG) != 0){
Recycler.getMmsRecycler().deleteOldMessagesByThreadId(getApplicationContext(),cursor.getLong(thread_index));
}
//删除短信
if((limitHasDecrescent& SMS_HAS_DECRESCENT_FLAG) != 0){
Recycler.getSmsRecycler().deleteOldMessagesByThreadId(getApplicationContext(),cursor.getLong(thread_index));
}
}
}
//状态置空
limitHasDecrescent =0;
}
…………………
}