gpt4 book ai didi

android - 用户离开 Activity 后如何接收已发送/已发送的个人短信的反馈

转载 作者:行者123 更新时间:2023-11-29 13:59:10 24 4
gpt4 key购买 nike

我有一个提供短信功能的应用程序。短信数据存储在应用程序数据库中。该应用程序支持发送给多个联系人,因此在发送短信时,我动态地注册了一个不同的 BroadcastReceiver 来监听每条短信是否发送(我使用字符串中的每个电话号码来标识 IntentFilter 中的操作)。

收到确认后,我将 SMS 写入数据库。

问题是,如果用户在广播“已发送”Intent 之前离开 Activity,则 BroadcastReceivers 会丢失,我无法再捕获“已发送”Intent,因此数据库不会更新。我选择的一种解决方法是实现 onKeyDown() 以防止用户在广播所有 Intent 之前关闭 Activity ,但此解决方案仅适用于“后退”按钮 - 无法捕获“主页”按钮事件。

这是我的代码:

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

最佳答案

您可以创建一个服务(不是 IntentService),您可以在其中实例化所有 BroadcastReceivers 并执行发送 SMS 逻辑。这样,您的 SMS-es 将在后台发送,您可以拦截已发送/传送的广播。

关于android - 用户离开 Activity 后如何接收已发送/已发送的个人短信的反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10430895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com