Android 将消息从广播接收器发送到服务

Android 将消息从广播接收器发送到服务,android,service,broadcastreceiver,Android,Service,Broadcastreceiver,我有一个发送sms消息的服务(通过AsyncTask)。我需要在BraodcaseReceiver的帮助下捕获发送/接收状态。 由于某些原因,我无法从接收器获得正确的resultCode。如果我在服务中实现onReceive,则resultCode始终为空 不确定我做错了什么,所以问题是,从Broadcase Receiver类将消息发送回后台服务的正确方式是什么 背景: protected boolean sendSMS(String number) { String SENT =

我有一个发送sms消息的服务(通过AsyncTask)。我需要在BraodcaseReceiver的帮助下捕获发送/接收状态。 由于某些原因,我无法从接收器获得正确的resultCode。如果我在服务中实现onReceive,则resultCode始终为空

不确定我做错了什么,所以问题是,从Broadcase Receiver类将消息发送回后台服务的正确方式是什么

背景:

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
,同时执行这两个操作。我有一个答案,这表明:。非常感谢!我会检查的。