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. VS2010 SP1安装失败之”此计算机的状态不支持此安装“()

    升级安装VS2010SP1的时候,出现“此计算机的状态不支持此安装”,Google得之: 如下图显示: 安装程序已经检测到,此计算机不满足安装此软件所需的条件.必须先解决以下这些造成阻止的问题,才可以 ...

  2. 如何得知当前机器上安装的PowerShell是什么版本的?

    $PSVersionTable.PSVersion   参考资料 ================ http://stackoverflow.com/questions/1825585/determi ...

  3. IntelliJ IDEA windows与mac下常用快捷键

    摘自: http://www.th7.cn/Program/java/201604/817219.shtml 1.找文件找代码找引用 shif双击在项目的所有目录查找 ctrl+f(mac下:comm ...

  4. Laravel学习笔记之Session源码解析(上)

    说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助.Laravel在web middleware中定义了 ...

  5. [转]Python机器学习工具箱

    原文在这里  Python在科学计算领域,有两个重要的扩展模块:Numpy和Scipy.其中Numpy是一个用python实现的科学计算包.包括: 一个强大的N维数组对象Array: 比较成熟的(广播 ...

  6. win7下使用Taste实现协同过滤算法

    如果要实现Taste算法,必备的条件是: 1) JDK,使用1.6版本.需要说明一下,因为要基于Eclipse构建,所以在设置path的值之前要先定义JAVA_HOME变量. 2) Maven,使用2 ...

  7. c#:winform从一个toolstriptool上拖动一个图标到一个自定义usercontrol内。

    效果: 在一个winform工程中,添加一个ToolStrip然后给它添加一个ToolStripButton(tsbStart,它就是红色框圈选的图标) this.toolStripTools = n ...

  8. GIT 如何从另一分支合并特定的文件

    是否遇到过这种情景: 您在一个分支上工作,发现该分支上的某些文件实现的功能已经在其他分支上实现了 但因为这两个分支实现不同的功能,因此不能进行简单的合并工作,但您又不想重复其他已经完成的工作 以下操作 ...

  9. MFC对话框:模态对话框及其弹出过程

    From: http://www.jizhuomi.com/school/c/160.html 加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨 ...

  10. CHtmlEditCtrl (2): Add a Source Text Editor to Your HTML Editor

    In a previous article, I described how to create an HTML editor using the MFC CHtmlEditCtrl class in ...