首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在用户离开活动后接收个人短信的发送/下发反馈

如何在用户离开活动后接收个人短信的发送/下发反馈
EN

Stack Overflow用户
提问于 2012-05-03 19:57:08
回答 1查看 1.3K关注 0票数 2

我有一个应用程序,提供短信。短信数据存储在app数据库中。该应用程序支持发送到多个联系人,所以当发送短信时,我会动态注册一个不同的BroadcastReceiver来监听是否发送了每条短信(我在字符串中使用每个电话号码来识别IntentFilter中的操作)。

收到短信发送确认后,我把短信写到数据库里。

问题是,如果用户在“已发送”意图被广播之前离开活动,则BroadcastReceivers将丢失,并且我无法再捕获“已发送”意图,因此数据库不会更新。我选择的一个解决方法是实现onKeyDown(),以防止用户在广播所有意图之前关闭活动,但此解决方案仅适用于"Back“按钮-无法捕获"Home”按钮事件。

下面是我的代码:

代码语言:javascript
复制
public void sendSMS(String[] phoneNumbers, String message){   

  final String currentMessage = message;
  SmsManager sms = SmsManager.getDefault(); 
  ArrayList<String> parts = sms.divideMessage(message);

     for(int i=0; i<phoneNumbers.length; i++){

    for(int j=0; j<parts.size(); j++){

        BroadcastReceiver sent = new BroadcastReceiver(){

             public void onReceive(Context arg0, Intent arg1) {             

                  String[] arg = arg1.getAction().split(KEY_SMS_SENT);  
                  String phoneNo = Utils.setSimpleFormatNumber(arg[1]);
                  String count = arg[0];
                  String parts = count.split(KEY_SMS_PART_NO)[0];
                  String partNo = count.split(KEY_SMS_PART_NO)[1];

                      sentReceivers.remove(this);
                      unregisterReceiver(this); 

                        switch (getResultCode())
                        {
                            case Activity.RESULT_OK:                    
                                if(parts.equals(partNo)){
                                    Toast.makeText(getBaseContext(), context.getString(R.string.sms_sent_message), 
                                        Toast.LENGTH_SHORT).show();                                                                                     

                           dbAdapter.createSentSMS(KEY_SMS_TYPE_SENT, phoneNo, currentMessage, Utils.getTimeStamp());                                                                       
                                }
                                break;
                            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                                if(parts.equals(partNo)){
                                    Toast.makeText(getBaseContext(), context.getString(R.string.sms_generic_failure_message), 
                                            Toast.LENGTH_SHORT).show();                                                                             

                                    dbAdapter.createSentSMS(KEY_SMS_TYPE_FAILED, phoneNo, currentMessage, Utils.getTimeStamp());                                                                        
                                }
                                break;
                            case SmsManager.RESULT_ERROR_NO_SERVICE:                                
                                if(parts.equals(partNo)){
                                    Toast.makeText(getBaseContext(), context.getString(R.string.sms_no_service_message), 
                                            Toast.LENGTH_SHORT).show();                                                                             

                                    dbAdapter.createSentSMS(KEY_SMS_TYPE_FAILED, phoneNo, currentMessage, Utils.getTimeStamp());                                                                        
                                }
                                break;
                            case SmsManager.RESULT_ERROR_NULL_PDU:                              
                                if(parts.equals(partNo)){
                                    Toast.makeText(getBaseContext(), context.getString(R.string.sms_null_pdu_message), 
                                            Toast.LENGTH_SHORT).show();                                                                             

                                    dbAdapter.createSentSMS(KEY_SMS_TYPE_FAILED, phoneNo, currentMessage, Utils.getTimeStamp());                                                                        
                                }
                                break;
                            case SmsManager.RESULT_ERROR_RADIO_OFF:                            
                                if(parts.equals(partNo)){
                                    Toast.makeText(getBaseContext(), context.getString(R.string.sms_radio_off_message), 
                                            Toast.LENGTH_SHORT).show();                                                                         

                                    dbAdapter.createSentSMS(KEY_SMS_TYPE_FAILED, phoneNo, currentMessage, Utils.getTimeStamp());                                                                        
                                }
                                break;
                        }
                    }
                };


                registerReceiver(sent, new IntentFilter(String.valueOf(parts.size()-1) + KEY_SMS_PART_NO + String.valueOf(j) + KEY_SMS_SENT  + phoneNumbers[i]));

                //I add the BroadcastReceiver-s to a Vector in order to keep track of them
                sentReceivers.add(sent);

                }
            }
            //I use an IntentService to do the actual sending
            Intent intent = new Intent(context, SMSSendService.class);
            intent.putExtra(KEY_SELECTED_PHONE_NUMBERS, phoneNumbers);
            intent.putExtra(KEY_SMS_MESSAGE, message);
            intent.putExtra(KEY_ACTION, KEY_REQUEST_SEND_SMS);
            startService(intent);
        }

这是IntentService中的代码:

代码语言:javascript
复制
public void sendSMS(String phoneNo, String message, SmsManager sms)
    {           
        ArrayList<String> parts = sms.divideMessage(message); 

        ArrayList<PendingIntent> sentPIs = new ArrayList<PendingIntent>();

        for(int i=0; i<parts.size(); i++){
            sentPIs.add(PendingIntent.getBroadcast(context, 0, new Intent(String.valueOf(parts.size()-1) + KEY_SMS_PART_NO + String.valueOf(i) + KEY_SMS_SENT + phoneNo), 0));

        }

        sms.sendMultipartTextMessage(phoneNo, null, parts, sentPIs, deliveredPIs);
    }
EN

回答 1

Stack Overflow用户

发布于 2012-11-19 02:29:08

您可以创建一个服务(而不是IntentService),在其中您可以实例化所有的BroadcastReceivers并执行send SMS逻辑。这样,您的SMS-es将在后台发送,您可以拦截发送/发送的广播。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10430895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档