BroadcastReceiver 组件不允许注册接收意图

Mad*_*uja 0 android

我正在尝试收听从特定发件人发送的包含特定关键字的非常具体的短信。为此,我创建了一个android.provider.Telephony.SMS_RECEIVED通过清单绑定的 BroadcastReceiver。

如果我发现特定发件人发送包含该关键字的短信,我需要从我的应用程序发送短信。我已经在我的应用程序中通过onReceive()函数做到了这一点。

问题是我想监听 SMS_SENT 和 SMS_DELIVERED 事件以了解短信是否已成功发送/传递。为此,我通过注册这些接收器

context.registerReceiver(smsSentReceiver, new  IntentFilter(Consts.SENT));
context.registerReceiver(smsDeliveredReceiver, new IntentFilter(Consts.DELIVERED));
Run Code Online (Sandbox Code Playgroud)

虽然,我已经实例化了一个单独的AsyncTask方法onReceive来完成这项工作,但我仍然收到以下错误 BroadcastReceiver components are not allowed to register to receive intents

我应该使用IntentService而不是AsyncTaskfrom 吗onReceive?或者我应该实例化一个IntentServicefromAsyncTask执行的吗onReceive

Mik*_* M. 5

您可以在一个 Receiver 中处理多种广播类型,因此您可以简单地将发送和交付定向Intent到正在处理的同一个 Receiver SMS_RECEIVED,然后从那里相应地分派工作;例如,到 aServiceWorker

\n

由于您的 SMS 接收器已在清单中静态注册,因此只需确保您的发送和传递Intent明确针对您的接收器类,并且您不需要更改清单中的任何内容。例如:

\n
public static final String ACTION_SMS_SENT = "com.example.app.SMS_SENT";\npublic static final String ACTION_SMS_DELIVERED = "com.example.app.SMS_DELIVERED";\n\n\nIntent sendIntent =\n        new Intent(ACTION_SMS_SENT, null, context, SmsReceiver.class);\n\nPendingIntent sendPending =\n        PendingIntent.getBroadcast(context, 0, sendIntent, \xe2\x80\xa6);\n
Run Code Online (Sandbox Code Playgroud)\n

在接收器中,首先检查操作,然后决定从那里开始:

\n
public class SmsReceiver extends BroadcastReceiver {\n\n    @Override\n    public void onReceive(Context context, Intent intent) {\n        switch (intent.getAction()) {\n            case Telephony.Sms.Intents.SMS_RECEIVED_ACTION:\n                \xe2\x80\xa6\n                break;\n\n            case ACTION_SMS_SENT:\n                \xe2\x80\xa6\n                break;\n\n            case ACTION_SMS_DELIVERED:\n                \xe2\x80\xa6\n                break;\n\n            default:\n                \xe2\x80\xa6\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n