2012-05-03 3 views
2

私はSMSメッセージングを提供するアプリを持っています。 SMSデータはappデータベースに保存されます。 アプリは複数の連絡先への送信をサポートしているので、SMSを送信するときは、各SMSが送信されたかどうかを聞くために別のBroadcastReceiverを登録します(IntentFilterのアクションを識別するStringの各電話番号を使用します)。ユーザーが活動を放棄した後、個々のSMSのフィードバック/配信されたフィードバックを受信する方法

私は送信された確認を受け取った後、SMSをデータベースに書きます。

"送信された"インテントがブロードキャストされる前にユーザーがアクティビティを離れると、BroadcastReceiversが失われ、 "送信された"インテントをもうキャプチャできないため、データベースは更新されません。私が選んだ一つの回避策は、すべてのインテントがブロードキャストされる前にユーザーがアクティビティを閉じるのを防ぐためにonKeyDown()を実装することでしたが、このソリューションは「戻る」ボタンでのみ機能します。ここで

は私のコードです:

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のコードです:

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

答えて

0

あなたはすべてのBroadcastReceiversをインスタンス化できているサービス(ないIntentService)を作成することができますし、 send SMSロジックを実行します。これにより、SMS-esがバックグラウンドで送信され、送信/配信されたブロードキャストを傍受することができます。

関連する問題