【问题标题】:Which request is my onReceive answering to?我的 onReceive 响应哪个请求?
【发布时间】:2011-02-20 15:16:53
【问题描述】:

我有一个包含电话号码和状态字段的联系人数组列表。我想更新成功发送结果的状态字段。

我什至尝试使用 contacts.indexOf(c.getPhoneNumber()) 作为 int requestCode 将 ArrayList 项的索引传递到 Pending Intent。我只是不知道如何判断哪条消息报告为成功并更新我的联系人项目。

package com.example.SMS;

public class SendSMSActivity extends SMSActivity {

    private EditText smsMessageBody;
    private Button send_button;
    private SmsManager sms;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sendsmsactivity);

        setupViews();

    }

    private void setupViews() {

        smsMessageBody = (EditText) findViewById(R.id.smsText_editText1);
        broadcast_button = (Button) findViewById(R.id.sendsms_button);

        send_button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                if (smsMessageBody.getText().toString().length() > 0 ) {
                    if (!getSendSMSApplication().getCurrentContacts().isEmpty()) {
                        sendSMSLoop();
                        Toast.makeText(getBaseContext(), R.string.messages_sent, Toast.LENGTH_SHORT).show();
                        getSendSMSApplication().setCurrentContacts(null);  //  Clear existing contacts after send
                        finish();
                    } else {
                        Toast.makeText(getBaseContext(), R.string.error_no_numbers, Toast.LENGTH_SHORT).show();
                    }   //  there are phone numbers to send to?
                } else {
                    Toast.makeText(getBaseContext(), R.string.error_no_message, Toast.LENGTH_SHORT).show();
                }   //  user entered a message?
            }
        });

    }

    protected void sendSMSLoop() {

        ArrayList<ContactItem> contacts = getSendSMSApplication().getCurrentContacts();

        for (ContactItem c:contacts) {
            sendSMS(c.getPhoneNumber().toString(), smsMessageBody.getText().toString(), contacts.indexOf(c.getPhoneNumber()));
        }

    }

    public void sendSMS(String phoneNumber, String message, int messageIndex)
    {        
        String SENT = "SMS_SENT";

        PendingIntent sentPI = PendingIntent.getBroadcast(this, messageIndex, new Intent(SENT), 0);


        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode())
                {
                case Activity.RESULT_OK:
                    Toast.makeText(getBaseContext(), R.string.sms_sent, Toast.LENGTH_SHORT).show();
                    break;
                }
            }
        }, new IntentFilter(SENT));

        sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, sentPI, null);

    }
}

【问题讨论】:

    标签: android sms arraylist android-pendingintent


    【解决方案1】:

    我现在正在尝试自己做这件事。我猜你和我有同样的问题,如果你发送超过 1 条消息,它们都会为所有 3 条消息返回相同的发送代码。我认为这里的技巧是“线程化”每条消息,以便每个“线程”都有不同的返回码。我不能保证这是解决方案,但这是我接下来要解决的问题。

    希望对你有帮助,如果你解决了也请告诉我。

    【讨论】:

    • 如果您想继续关注,您介意删除您的答案并只收藏该问题吗?我认为我没有太多活动,因为这在列表中显示为已回答。如果找到答案,我一定会记住你。谢谢德赫!
    • Bill,我认为我在 uni 的讲师现在已经更好地向我解释了这一点。您是否已经到了获得接收/交付意图的阶段?其中一个(认为是后者)“有附加功能”,其中一个可能是 PUDS。这应该包含消息/发送者/某种识别信息。我不得不稍微改变一下我的课程,但我想我几乎找到了解决方案。希望这对您有所帮助。
    【解决方案2】:

    这是从我的实际代码中提取的一些代码:

    public void onReceive(Context context, Intent intent) {
    Bundle bundle = intent.getExtras();
        if (bundle != null) {
            Object[] pdus = (Object[]) bundle.get("pdus");
            final SmsMessage[] messages = new SmsMessage[pdus.length];
            for (int i = 0; i < pdus.length; i++)
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
            if (messages.length > -1) {
    //The 2 variables you need (from and body)
    messages[0].getOriginatingAddress();
    messages[0].getMessageBody();
    ...
    

    尝试将接收/传递的意图传递给此函数(完成该函数以添加您需要的功能),我将在几周后尝试它,所以如果您击败我,请告诉我它是如何进行的。

    刚刚重新查看了您的代码...

    sms.sendTextMessage(phoneNumber, null, message, sentPI, null);
    

    我的代码看起来更像:

    sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
    

    据我所知,您需要添加额外的意图来使用 pdus。

    【讨论】:

    • 我能够接收“已发送”和“已交付”信息,但我不知道如何区分已发送或已交付的发送。我也有一个交付的PI,但我删除了它,因为它不相关,除非我能真正确定来自哪个意图。如果没有别的,您上面的代码是一个很好的提示。缺少我通常需要的解决方案 :) 感谢您的帮助!
    • 我认为我们可以在这方面互惠互利,我有一种方法可以很容易地区分发送和传递的意图,你有Skype吗? - 通过您网站上的联系表向您发送消息。
    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 2019-08-17
    • 2017-06-13
    • 2019-09-04
    • 1970-01-01
    • 2021-07-17
    • 2020-11-25
    相关资源
    最近更新 更多