这里造成错误的流程是
短信设置--编辑常用短信--添加新短语--退至短信设置--再进入添加新短语--报ANR
编辑常用短语的Activity是SmsTemplateEditActivity
每次第二次插入短语都会报错,点击出错的窗口后又可以插入了
其实在我不做任何更改的情况下,去设置里面将短信应用的数据清空也会报错
这是为什么了
点击短信设置的编辑常用用语
进入SmsTemplateEditActivity.java
进入onCreate方法里面
super.onCreate(savedInstanceState);
MmsLog.d(TAG, "SmsTemplateEditActivity onCreate");
setContentView(R.layout.sms_template_edit_activity);
getActionBar().setDisplayHomeAsUpEnabled(true);
mToast = Toast.makeText(this, R.string.cannot_save_message, Toast.LENGTH_SHORT);
addButton = (Button) findViewById(R.id.quickText_add_button);
addButton.setTextSize(13);
addButton.setOnClickListener(new android.view.View.OnClickListener() {
public void onClick(View v) {
switch (v.getId()) {
case R.id.quickText_add_button:
addQuickText();
break;
default:
break;
}
}
});
mListView = (ListView) findViewById(R.id.quick_text_list);
mListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
InputMethodManager inputM =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (getWindow() != null && getWindow().getCurrentFocus() != null) {
inputM.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
}
mQuickTextId = MmsConfig.getQuicktextsId().get(Integer.valueOf((int) id));
mQuickText = MmsConfig.getQuicktexts().get(Integer.valueOf((int) id));
showEditDialog();
return;
}
});
mNewQuickText = (EditText) findViewById(R.id.new_quick_text);
mNewQuickText.setHint(R.string.type_to_quick_text);
textItem = (TextView) findViewById(R.id.new_quick_text);
这部分代码主要是初始化这个编辑常用短语的界面,给添加按键和listview里面的item添加监听
if (MmsConfig.getInitQuickText()) {
MmsLog.d(TAG, "MmsConfig.getInitQuickText() : " + MmsConfig.getInitQuickText());
String[] default_quick_texts = getResources().getStringArray(
R.array.default_quick_texts);
MmsLog.d(TAG, "default_quick_texts : " + default_quick_texts);
for (int i = 0; i < default_quick_texts.length; i++) {
// modify begin
//addST("");
int updateResult=updateST(i+1, default_quick_texts[i]);
if(updateResult<=0){
addST(default_quick_texts[i]);
}
//modify end
}
MmsConfig.setInitQuickText(false);
为什么要把addST("")注释掉,让我慢慢说,当我们进入设置--应用里面把Mms的数据清掉以后
启动Mms就会走上面的一段代码
default_quick_texts是系统自带的九个短语,这里做了一个循环,从0到8
每次都会调用addST(""),这里就会有问题了,找到addST方法
</pre><pre name="code" class="java">private boolean addST(String str) {
// Insert a new record into the Events data source.
// You would do something similar for delete and update.
if (hasQuicktext(str)) {
return false;
}
ContentValues values = new ContentValues();
values.put(_ID, mMaxQuickTextId + 1);
values.put(TEXT, str);
getContentResolver().insert(Telephony.MmsSms.CONTENT_URI_QUICKTEXT, values);
if (MmsConfig.getInitQuickText()) {
mMaxQuickTextId++;
}
return true;
}
它会在mMaxQuickTextId 之后在接着添加数据,而这时的
mMaxQuickTextId还没有计算,默认值是0;
在这里我们通过这一句
getContentResolver().insert(Telephony.MmsSms.CONTENT_URI_QUICKTEXT,values);
我们知道,这些短语的保存可能跟Telephony有关
Telephony是TelephonyProvider中的一个类,那么肯定是保存在了TelephonyProvider的数据库中
而现在数据库中已经存在了我们本来的9个短语和我们添加的一些短语,你再在1位置上添加空白短语
那肯定会报错。----所以我们将这句代码注释掉。
int updateResult=updateST(i+1, default_quick_texts[i]);
if(updateResult<=0){
addST(default_quick_texts[i]);
}
这段代码中updateST返回的是更新的那一行的number
因为设置清空的是一些配置,我每次push进去手机的是,apk文件,并不会改变
data先的数据库文件,所以,上面这个循环在设置清空后不会执行,
只有当这个应用第一次被安装的时候才会执行,将常用的这9个短语通过
addST加进去。
那么回到主题,为什呢么编辑一个短语后,退出来,再进入编辑另一个会报错了
让我们进入onResume方法中
protected void onResume() {
super.onResume();
/// KK migration, for default MMS function. @{
boolean isSmsEnabled = MmsConfig.isSmsEnabled(this);
if (!isSmsEnabled) {
finish();
}
Log.i("MmsQL", "onResume MmsConfig.getQuicktexts().size()="+MmsConfig.getQuicktexts().size());
//modify begin
//if (MmsConfig.getQuicktexts().size() == 0) {
//mMaxQuickTextId = MmsConfig.updateAllQuicktexts();
// }
mMaxQuickTextId = MmsConfig.updateAllQuicktexts();
//modify end
MmsLog.d(TAG, "updateAllQuicktexts allQuickTexts : " + MmsConfig.getQuicktexts());
adapter.notifyDataSetChanged();
/// @}
}
MmsConfig.getQuicktexts()方法得到的是一个常用短语的list集合
里面有一个判断,当这个集合的size等于0时会执行得到mMaxQuickTextId 的方法
updateAllQuicktexts,这个方法在返回mMaxQuickTextId 的同时,将数据库中的数据
加载到了手机界面的Listview中
这设置里面将应用的数据清空后,第一次进入Mms进入编辑常用短语时并没有问题
因为此时,listview还没有从数据库中加载数据,里面还没有短语,size确实等于0,这个时候就得到了mMaxQuickTextId 的值,
然后调用 adapter.notifyDataSetChanged
但是,当我们退出以后第二次进入的时候就有问题了
因为此时,size已经不再是0,那么就不会执行这个
mMaxQuickTextId = MmsConfig.updateAllQuicktexts();
那么当我们添加一个短语时,点击添加按钮,会在id为1的位置上添加,而那个地方在数据库中是有值的,
所以会报错。就有了以上的更改,不要这个判断语句,直接每次执行onResume时,都会得到
mMaxQuickTextId 的值,这样就不再有问题了