Android 将消息从广播接收器发送到服务
我有一个发送sms消息的服务(通过AsyncTask)。我需要在BraodcaseReceiver的帮助下捕获发送/接收状态。 由于某些原因,我无法从接收器获得正确的resultCode。如果我在服务中实现onReceive,则resultCode始终为空 不确定我做错了什么,所以问题是,从Broadcase Receiver类将消息发送回后台服务的正确方式是什么 背景:Android 将消息从广播接收器发送到服务,android,service,broadcastreceiver,Android,Service,Broadcastreceiver,我有一个发送sms消息的服务(通过AsyncTask)。我需要在BraodcaseReceiver的帮助下捕获发送/接收状态。 由于某些原因,我无法从接收器获得正确的resultCode。如果我在服务中实现onReceive,则resultCode始终为空 不确定我做错了什么,所以问题是,从Broadcase Receiver类将消息发送回后台服务的正确方式是什么 背景: protected boolean sendSMS(String number) { String SENT =
protected boolean sendSMS(String number) {
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
registerReceiver(sendBroadcastReceiver, new IntentFilter(SENT));
registerReceiver(deliveryBroadcastReceiver, new IntentFilter(DELIVERED));
String destinationAddress = number;
String smsMessage = String.format("This is test");
String scAddress = null;
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(destinationAddress, scAddress, smsMessage, sentPI, deliveredPI);
return true;
}
BroadcastReceiver sendBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Integer resultCode = intent.getExtras().getInt("msg");
//resultCode is always null here
Log.d("Debug", "sendBroadcastReceiver code: "+ resultCode);
}
};
public class SentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent arg1) {
Integer resultcode = getResultCode();
//**for some reason when I define onReceive in Service class**
//**I don't get any debug message as if this code doesn't execute**
Log.d("Debug", "Code: "+ resultcode);
Intent intent = new Intent("SMS_SENT");
intent.putExtra("msg", resultcode);
context.sendBroadcast(intent);
}
}
应用程序由一个只运行后台服务的活动组成。在该服务中,我发送短信息
我不太擅长Android设计模式,但从我在互联网上看到的情况来看,要获得短信状态的结果,我需要创建一个单独的类作为BraodcaseReceiver。这就是为什么我创造了一个。BroadcastReceiver应该获得已发送消息的状态,我希望能够将该值传递给服务(稍后从服务传递给活动)
所以我要做的是:aaActivity->Service->SendSMS,然后在任务完成时,我想接收发送的sms的状态
注意:我刚刚意识到我没有使用AsyncTask发送短信。我只想将该服务用作发送sms消息的AsyncTasks的管理器,我不想让发送消息的任务阻止该服务。这个设计好吗
服务:
protected boolean sendSMS(String number) {
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
registerReceiver(sendBroadcastReceiver, new IntentFilter(SENT));
registerReceiver(deliveryBroadcastReceiver, new IntentFilter(DELIVERED));
String destinationAddress = number;
String smsMessage = String.format("This is test");
String scAddress = null;
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(destinationAddress, scAddress, smsMessage, sentPI, deliveredPI);
return true;
}
BroadcastReceiver sendBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Integer resultCode = intent.getExtras().getInt("msg");
//resultCode is always null here
Log.d("Debug", "sendBroadcastReceiver code: "+ resultCode);
}
};
public class SentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent arg1) {
Integer resultcode = getResultCode();
//**for some reason when I define onReceive in Service class**
//**I don't get any debug message as if this code doesn't execute**
Log.d("Debug", "Code: "+ resultcode);
Intent intent = new Intent("SMS_SENT");
intent.putExtra("msg", resultcode);
context.sendBroadcast(intent);
}
}
广播接收者:
protected boolean sendSMS(String number) {
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
registerReceiver(sendBroadcastReceiver, new IntentFilter(SENT));
registerReceiver(deliveryBroadcastReceiver, new IntentFilter(DELIVERED));
String destinationAddress = number;
String smsMessage = String.format("This is test");
String scAddress = null;
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(destinationAddress, scAddress, smsMessage, sentPI, deliveredPI);
return true;
}
BroadcastReceiver sendBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Integer resultCode = intent.getExtras().getInt("msg");
//resultCode is always null here
Log.d("Debug", "sendBroadcastReceiver code: "+ resultCode);
}
};
public class SentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent arg1) {
Integer resultcode = getResultCode();
//**for some reason when I define onReceive in Service class**
//**I don't get any debug message as if this code doesn't execute**
Log.d("Debug", "Code: "+ resultcode);
Intent intent = new Intent("SMS_SENT");
intent.putExtra("msg", resultcode);
context.sendBroadcast(intent);
}
}
现在还不清楚你到底想做什么,但是那些接收者有点混淆了。使用当前设置,
服务
中的发送广播接收器
是检查结果代码的地方;i、 例如,在这里调用getResultCode()
。我不确定另一个BroadcastReceiver
的用途。对不起,我添加了一些关于该代码实际作用的更多信息。希望现在更清楚了。如果您认为我的方法不正确,请务必更正我的代码。您不一定需要单独的Receiver类。atm机,你的接收器太多了。按原样,您的send
pendingent
将触发sendBroadcastReceiver
。另一个SentReceiver
什么也没做。将请求代码移到sendBroadcastReceiver
中,然后删除context.sendBroadcast()
code。您可以将同一个接收器同时用于这两个接收器。您只需将它注册到一个IntentFilter
,同时执行这两个操作。我有一个答案,这表明:。非常感谢!我会检查的。