1. 应该在子线程中执行发送短信的操作。

如果没有在子线程中发送短信会出现错误:点击发送短信之后,立即跳转到其他界面,那么这次发送短信可能就会失败!

请注意往子线程方法中传入外部的实参必须由final修饰。

private void performSendMessage(final String content) {
    if(content.length()==0) {
        Toast.makeText(mContext, "can't send a blank msg.", Toast.LENGTH_SHORT).show();
    } else {
        mEditMsg.setText("");
        final String[] numbers = mNumber.split(",");
        final Uri uri = Telephony.Sms.Outbox.addMessage(getContentResolver(), "13146491338", content,
                null, System.currentTimeMillis(), false, mThreadId);
        onOutboxAddMessage(uri);
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                sendMessage(numbers[0], content, uri);
            }
        });
    }
}

2. 应该将SentMsgReceiver静态注册,而不是在短信列表界面中动态注册。

如果在短信列表中动态注册,点击发送短信之后,立即跳转到其他界面,那么会执行onDestroy()方法,调用unRegisterReceiver()注销SentMsgReceiver。

在com.txrj.sms.receiver包中新建SentMsgReceiver类(在SentMsgReceiver.java文件实现)

public class SentMsgReceiver extends BroadcastReceiver {
    Context mContext;

    @Override
    public void onReceive(Context context, Intent intent) {
        mContext = context;
        Uri uri = intent.getParcelableExtra(TxrjConstant.EXTRA_SENT_URI);
        int resultCode = getResultCode();
        if(resultCode == Activity.RESULT_OK) {
            Toast.makeText(context, "send message success.", Toast.LENGTH_SHORT).show();
            updateMsgType(uri, Sms.MESSAGE_TYPE_SENT);
        } else if(resultCode == SmsManager.RESULT_ERROR_GENERIC_FAILURE) {
            Toast.makeText(context, "Generic failure.", Toast.LENGTH_SHORT).show();
            updateMsgType(uri, Sms.MESSAGE_TYPE_FAILED);
        } else if(resultCode == SmsManager.RESULT_ERROR_NO_SERVICE) {
            Toast.makeText(context, "service is currently unavailable.", Toast.LENGTH_SHORT).show();
            updateMsgType(uri, Sms.MESSAGE_TYPE_FAILED);
        } else if(resultCode == SmsManager.RESULT_ERROR_NULL_PDU) {
            Toast.makeText(context, "no pdu provided.", Toast.LENGTH_SHORT).show();
            updateMsgType(uri, Sms.MESSAGE_TYPE_FAILED);
        } else if(resultCode == SmsManager.RESULT_ERROR_RADIO_OFF) {
            Toast.makeText(context, "radio was explicitly turned off.", Toast.LENGTH_SHORT).show();
            updateMsgType(uri, Sms.MESSAGE_TYPE_FAILED);
        }
    }
    private void updateMsgType(Uri uri, int type) {
        ContentValues values = new ContentValues();
        values.put(Sms.TYPE, type);
        mContext.getContentResolver().update(uri, values, null, null);
    }
}

最新文章

  1. 第14章 Linux启动管理(3)_系统修复模式
  2. bzoj 2739 最远点
  3. Leetcode Simplify Path
  4. Android实现滑动刻度尺效果,选择身高体重和生日
  5. C#窗体自定义控件
  6. Trace-导出已有的服务器端跟踪
  7. hadoop1.2.1 伪分布式配置
  8. const和#define的区别
  9. sentos 上安装vnc图形界面
  10. Java循环语句 for
  11. Struts2:ValueStack
  12. struts 2 三目运算
  13. contextmenu
  14. POJ 2155 Matrix (D区段树)
  15. 多线程编程-- part 2 线程的生命周期和优先级
  16. meta标签属性总结
  17. Android 实现高仿iOS桌面效果之可拖动的GridView(上)
  18. Unity 3D游戏开发学习路线(方法篇)
  19. Python爬虫【实战篇】百度翻译
  20. SharePoint REST API - 同步SharePoint列表项

热门文章

  1. IT痴汉的工作现状42-Android越用越慢?立场不同,谈何信任!
  2. 滴滴大数据算法大赛Di-Tech2016参赛总结
  3. Introduction to Learning to Trade with Reinforcement Learning
  4. Mahout分步式程序开发 基于物品的协同过滤ItemCF
  5. 前端笔记----jquery入门知识点总结 (转)
  6. 夏天过去了, 姥爷推荐几套来自smashingmagzine的超棒秋天主题壁纸
  7. c++ 11 游记 之 decltype constexpr
  8. OS 获取用户相册。保存图片。编辑图片为圆形
  9. SHELL字符串使用总结
  10. javascript将算法复杂度从O(n^2)做到O(n)