我正在读取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让我明白这个循环吗?
答案 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来跟踪您的确认。