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);
    }
}

在子线程中发送短信,静态注册SentMsgReceiver。的更多相关文章

  1. 【转载】Delphi7从子线程中发送消息到主线程触发事件执行

    在对数据库的操作时,有时要用一个子线程来进行后台的数据操作.比如说数据备份,转档什么的.在主窗口还能同是进行其它操作.而有时后台每处理一个数据文件,要向主窗口发送消息,让主窗口实时显示处理进度在窗口上 ...

  2. iOS中发送短信/发送邮件的实现 韩俊强的博客

    需要引入框架: MessageUI.framework 布局如下: 短信和邮件: #import "ViewController.h" #import <MessageUI/ ...

  3. Android 中发送短信

    import android.net.Uri; //调用Android系统API发送短信 Uri uri = Uri.parse("smsto:" + strSmsPhone_va ...

  4. andorid中发送短信页面以及邮件发送

    跳转到发送短信页面 Uri smsToUri = Uri.parse("smsto://10086"); Intent mIntent = new Intent( android. ...

  5. iOS 在当前控制器中发送短信

    - (void)showMessageViewWithTel:(NSString *)tel { if( [MFMessageComposeViewController canSendText] ){ ...

  6. android 几种发送短信的方法

    android中发送短信很简单, 首先要在Mainfest.xml中加入所需要的权限: ? 1 2 3 <uses-permission android:name="android.p ...

  7. iOS开发之线程间的MachPort通信与子线程中的Notification转发

    如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification.简单的说,MachPort的工作方式其实是将NSMa ...

  8. android 发送短信的两种方式,以及接收报告和发送报告

               android发送短信,以及接收报告和发送报告          android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下:    一.调起系统发短信功能    ...

  9. YII 中加入短信接口的函数

    public function smsto($telphone,$message) { //短信接口用户名 $uid,如果没有或不能发送请与客服联系 $uid = 'zyd'; //短信接口密码 $p ...

随机推荐

  1. maskrcnn_benchmark代码分析(1)

    可以先参考:Faster-RCNN代码+理论——1/2 Object Detection and Classification using R-CNNs 使用ipdb调试 try: import ip ...

  2. AS 注解处理器 APT Processor MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. C#访问远程主机资源的方法

    实现访问远程主机的共享目录中的一个文件的解决方法: 一.调用Net use命令 // 使用方法:        //if (Connect("192.168.1.48", &quo ...

  4. 最全的spark基础知识解答

    原文:http://www.36dsj.com/archives/61155 一. Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduc ...

  5. 基于PHP构建OAuth 2.0 服务端 认证平台

    OAuth2.0 认证服务 安装 你可以在github上下载OAuth Server PHP,也可以用下列命令下载,不过内容都是一样的 mkdir my-oauth2-walkthrough cd m ...

  6. C++结构变量数据对齐问题

    为了避免混淆.做例如以下规定,下面代码若不加特殊说明都执行于32位平台,结构体的默认对齐值是8,各数据类型所占字节数分别为 char占一个字节 int占四个字节 double占八个字节. 两个样例 请 ...

  7. 被查封7周之后,全球最大BT网站“海盗湾”又重新活过来了【36kr】

    原文地址 原文地址 "免费"和"版权","自由"和"监管"永远在较量啊,矛盾共同体,事物的两面性~ 被查封7周之后,全球 ...

  8. Word模板中的表格处理

    在软件系统中,我们经常要输出一些word ,excel,ppt文档,为了输出结果漂亮美观.输出操作方便快捷,通常要制作一些模板文件,通过对模板文件中的关键信息进行修改,就不用管排版.格式等处理了. 在 ...

  9. Jenkins Xcode打包ipa

    本地打包. 如果Mac 上没有安装brew.先安装:ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/ins ...

  10. WinForm程序开发

    WinForm程序开发------------------------------主要页面----------------------------------BaseForm.cs    基类,用于派 ...