如何理解短信发送代码?

时间:2014-02-11 15:19:40

标签: android android-intent sms android-broadcast

我正在读取android中的短信息。我有代码,但我很困惑或没有真正理解它。

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& deliverPI,我在sendTextMessage()中使用;这意味着我将挂起的意图发送到smsManager类。

我已经注册了2个广播接收者,这将通过匹配SMS_SENT&的意图来接收。 SMS_DELIVERED。 在书中它表示SMS_SENT&当消息被发送或传递时,SmsManager将触发SMS_DELIVERED。这意味着它会获得SMS_SENT&的意图消息。来自SmsManger的SMS_DELIVERED?或者是我在sendTextMessage中发送的意图? 困惑..... SomeOne PLZ帮帮我? PLZ让我明白这个循环吗?

1 个答案:

答案 0 :(得分:2)

PendingIntents被提供给其他应用/流程,作为他们将消息发送回您自己的应用的方式,就好像它是您自己的。

SmsManager将处理您提供的两个PI并执行此操作:首先,当SmsManager可以确认SMS已放入网络(“已发送”)时,它将广播您的“SMS_SENT”待处理意图,以便您可以更新你的短信数据库消息已经消失。

其次,一旦网络通知SmsManager SMS已交付(如果网络支持此功能并且某些网络上有此功能的成本),则SmsManager会将“SMS_DELIVERED”PI发送到您的应用,以便您可以通知用户/更新SMS数据库。

由于成本原因,您应该有一个选项让用户启用/禁用DELIVERY通知。

此外,正是这些行创建了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相同 - 创建意图,在其中放入任何你想要的东西,然后它会将它发送回你的应用程序。例如,您可以设置消息ID来跟踪您的确认。