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. c#利用SWIG调用c++dll学习总结【转】

    开发环境: 操作系统:windows 7 IDE:Microsoft Visual Studio Professional 2015 SWIG: 3.0.12 swig的介绍 详细介绍可看官网,一下贴 ...

  2. 如何远程运行PowerShell命令?

    首先, 被remote运行PowerShell的windows必须已经join了domain. 其次, 该Windows的PowerShell必须开启对remote command的接受, 运行下面的 ...

  3. 如何在Vblock里配置Boot from SAN

    啥是vBlock ============ vBlock是VCE用在包含了它的数据中心产品的组件的机架上的一个商标名. 机架中的组件都是有VCE出厂前预先组装好的, 组件的预设以及解决方案, 都是客户 ...

  4. WebView&HTML5-----使用WebView播放HTML5视频文件

    一.问题描述 HTML5提供了很多新的特性比如,视频播放.web本地存储.地理定位.应用缓存.Canvas等,但这些特性需要浏览器的支持,在Android应用中我们可以使用WebView构建Web应用 ...

  5. Android Studio快速集成讯飞SDK实现文字朗读功能

    今天,我们来学习一下怎么在Android Studio快速集成讯飞SDK实现文字朗读功能,先看一下效果图: 第一步 :了解TTS语音服务 TTS的全称为Text To Speech,即“从文本到语音” ...

  6. 开源ckplayer 网页播放器去logo去广告去水印修改

    功能设置介绍 本教程涉及到以下各点,点击对应标题页面将直接滑动到相应内容: 1:修改或去掉播放器前置logo 2:修改或去掉右上角的logo 3:修改.关闭.设置滚动文字广告 4:去掉右边的开关灯分享 ...

  7. 【Scala】Scala-循环与遍历

    Scala-循环与遍历 scala for 1000_百度搜索 Scala 2.8的for表达式:性能与运行顺序的改进 - 51CTO.COM scala List集合的用法 - CSDN博客

  8. Linux系统性能优化

    CPU性能评估 通过下面的命令能了解到CPU是否出现性能瓶颈,再结合top.ps等命令进一步检查,即可定位到那些进程导致CPU负载过大 vmstat命令:查看CPU负载. [blackfox@loca ...

  9. Mac下brew/memcached/nginx/iterm/zsh的安装

    brew  https://www.cnblogs.com/fireworld/p/8609190.html memcached https://blog.csdn.net/whereismatrix ...

  10. .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解

    本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...