在子线程中发送短信,静态注册SentMsgReceiver。

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

posted on 2013-07-19 01:28  勤修  阅读(257)  评论(0编辑  收藏  举报

导航