Как понять код отправки СМС?

Читал смс в андроиде. Вот код, но я запутался или не совсем правильно его понимаю.

public class SMSActivity extends Activity 
{     
   String SENT = “SMS_SENT”;
   String DELIVERED = “SMS_DELIVERED”;  
   PendingIntent sentPI, deliveredPI; 
   BroadcastReceiver smsSentReceiver, smsDeliveredReceiver

    @Override     
   public void onCreate(Bundle savedInstanceState) 
  {         super.onCreate(savedInstanceState);  
     setContentView(R.layout.main);
    sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
    deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
  }

 @Override 
 public void onResume() 
 {         
   super.onResume();
   smsSentReceiver = new BroadcastReceiver()
             {             
                @Override             
              public void onReceive(Context arg0, Intent arg1) 
                  {                 
                   switch (getResultCode())
                     {             
                      case Activity.RESULT_OK: Toast.makeText(getBaseContext(), “SMS sent”, Toast.LENGTH_SHORT).show();   break;       
                      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
                            Toast.makeText(getBaseContext(), “Genericfailure”,Toast.LENGTH_SHORT).show(); break;
                       }}
               };

     smsDeliveredReceiver = new BroadcastReceiver()
       {            
        @Override             
        public void onReceive(Context arg0, Intent arg1) 
            {                 
             switch (getResultCode())                 
              {                 
              case Activity.RESULT_OK:                     
                 Toast.makeText(getBaseContext(), “SMS delivered”, Toast.LENGTH_SHORT).show(); break;                 
              case Activity.RESULT_CANCELED: 
                   Toast.makeText(getBaseContext(), “SMS not delivered”, Toast.LENGTH_SHORT).show(); break;                
              }             
            }          

registerReceiver(smsDeliveredReceiver, new IntentFilter(DELIVERED));                 
registerReceiver(smsSentReceiver, new IntentFilter(SENT));     }

 //button click event method
 public void onClick(View v) 
  {  sendSMS(“5556”, “Hello my friends!”);     }

 private void sendSMS(String phoneNumber, String message)     
 {         SmsManager sms = SmsManager.getDefault();          
     sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);     
 } 
}

Здесь у меня есть 2 ожидающих намерения: sentPI и deliveryPI, которые я использую внутри sendTextMessage (); Это означает, что я отправляю ожидающие намерения в класс smsManager.

И я зарегистрировал 2 широковещательных приемников, которые будут получать через намерение, соответствующее SMS_SENT и SMS_DELIVERED. В книге сказано, что SMS_SENT & SMS_DELIVERED будет запущен SmsManager, когда сообщение будет отправлено или доставлено. Означает ли это, что я получу намеренное сообщение SMS_SENT и SMS_DELIVERED от SmsManger? или это намерения, которые я отправляю в sendTextMessage? Смущает ..... SomeOne, плз, помогите? пожалуйста, дайте мне понять цикл?


person shaon007    schedule 11.02.2014    source источник


Ответы (1)


PendingIntents предоставляются другим приложениям / процессам как способ отправить сообщение обратно в ваше собственное приложение, как если бы оно было вашим собственным.

SmsManager обработает два PI, которые вы ему даете, и сделает следующее: во-первых, когда SmsManager может подтвердить, что SMS было отправлено в сеть («отправлено»), он передаст ваше ожидающее намерение «SMS_SENT», чтобы вы могли обновить свою базу данных SMS. что сообщение исчезло.

Во-вторых, как только сеть уведомит SmsManager о доставке SMS (если сеть поддерживает эту функцию и в некоторых сетях для этой функции есть стоимость), SmsManager отправит ваш PI "SMS_DELIVERED" в ваше приложение, чтобы вы могли уведомить пользователя / обновить базу SMS.

У вас должна быть возможность для пользователя включить / отключить уведомление о ДОСТАВКЕ из-за затрат.

Кроме того, эти строки создают PendingIntents:

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

Но неважно, как они называются. Эта строка определяет один как «отправленный», а другой «доставленный»:

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

другой способ написать это:

 sms.sendTextMessage(phoneNumber, null, message, SMS_SENT_CONFIRMATION, SMS_DELIVER_CONFIRMATION);     

SmsManager сохраняет все, что вы поместили в SMS_SENT_CONFIRMATION, пока сообщение не будет отправлено. И то же самое с SMS_DELIVER_CONFIRMATION - создайте намерение, поместите в него все, что хотите, а затем оно отправит его обратно в ваше приложение. Вы можете указать идентификатор сообщения, например, для отслеживания ваших подтверждений.

person Jim    schedule 11.02.2014
comment
что означает, что если я дам SMS_Sent_Success, то SsmManager будет транслировать его вместо SMS_SENT? и внутри registerReciever () я тоже должен использовать строку SMS_sent_success (намеренно)? и SMS_SENT на самом деле не является собственной строкой / намерением Smsmanager? - person shaon007; 11.02.2014