I have an app that provides SMS messaging. The SMS data is stored in app database. The app supports sending to multiple contacts, so when sending an SMS, I dinamically register a different BroadcastReceiver to listen if each SMS was sent (I use each phone number in the String identifying the action in the IntentFilter).
我在收到发出的确认书后,将SMS写进数据库。
问题是,如果用户在“实体”广播之前就离开活动,那么广播接收器就会丢失,我无法再抓住“实体”,因此数据库没有更新。 我选择的一个工作是,在KeyDown(KeyDown())实施,以防止用户在播放所有斜体之前停止活动,但这一解决办法只使用“Back”纽顿语——“Home”纽顿语的活动是无法捕获的。
我的守则是:
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);
}
《刑法》
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);
}