Android 等待来自广播接收器的结果

Android 等待来自广播接收器的结果,android,broadcastreceiver,progressdialog,Android,Broadcastreceiver,Progressdialog,我想从我的活动启动ProgressDialog和广播接收器(SMS_RECEIVED)。当收到来自定义号码的短信时,它将停止对话框并分析短信文本 在我拥有对话和接收器的那一刻,两者都起作用。当我关闭对话框时,它会停止接收器 但是,当短信接收并将短信文本发送给活动时,如何使对话框关闭 “我的活动”中的ProgressDialog: protected void sendSMS(String sms){ try { final ComponentNam

我想从我的活动启动ProgressDialog和广播接收器(SMS_RECEIVED)。当收到来自定义号码的短信时,它将停止对话框并分析短信文本

在我拥有对话和接收器的那一刻,两者都起作用。当我关闭对话框时,它会停止接收器

但是,当短信接收并将短信文本发送给活动时,如何使对话框关闭

“我的活动”中的ProgressDialog:

    protected void sendSMS(String sms){
        try {
            final ComponentName receiver = new ComponentName(this, IncomingSms.class);
            final PackageManager pm = this.getPackageManager();
            pm.setComponentEnabledSetting(receiver,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);


            waitSms = new ProgressDialog(this);
            waitSms.setTitle("Warte auf Bestätigungs SMS");
            waitSms.setCancelable(false);
            waitSms.setMessage("Abbrechen setzt die Einstellung in der App auf inaktiv zurück. Nicht warten übernimmt die Einstellung in der App, wartet aber nicht weiter auf eine Bestätigungs SMS.");
            waitSms.setButton(DialogInterface.BUTTON_NEGATIVE, "Abbrechen", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
                    waitSms.dismiss();
                }
            });
            waitSms.setButton(DialogInterface.BUTTON_POSITIVE, "Nicht warten", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
                    waitSms.dismiss();
                }
            });
            waitSms.show();
        }
我的广播接收器:

public class IncomingSms extends BroadcastReceiver {

    // Get the object of SmsManager
    final SmsManager sms = SmsManager.getDefault();

    public void onReceive(Context context, Intent intent) {

        // Retrieves a map of extended data from the intent.
        final Bundle bundle = intent.getExtras();

        try {

            if (bundle != null) {

                final Object[] pdusObj = (Object[]) bundle.get("pdus");

                for (int i = 0; i < pdusObj.length; i++) {

                    SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                    String phoneNumber = currentMessage.getDisplayOriginatingAddress();

                    String senderNum = phoneNumber;
                    String message = currentMessage.getDisplayMessageBody();

                    Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + message);

                    int duration = Toast.LENGTH_LONG;
                    Toast toast = Toast.makeText(context, "senderNum: "+ senderNum + ", message: " + message, duration);
                    toast.show();

                } // end for loop
            } // bundle is null

        } catch (Exception e) {
            Log.e("SmsReceiver", "Exception smsReceiver" +e);
        }
    }
}
public class IncomingSms扩展广播接收器{
//获取SmsManager的对象
final smsmsmanager sms=smsmsmanager.getDefault();
公共void onReceive(上下文、意图){
//从意图检索扩展数据的映射。
final Bundle=intent.getExtras();
试一试{
if(bundle!=null){
最终对象[]pdusObj=(对象[])bundle.get(“pdus”);
对于(int i=0;i

Thx以获取帮助

您使用您的标志禁用了接收器:

PackageManager.COMPONENT\u已启用\u状态\u已禁用

相反,请尝试以下方法:

PackageManager.COMPONENT\u已启用\u状态\u已启用

然后在接收器onReceive内,使用Intent extras将数据移动到活动中,并使用onNewIntent()截获它们


发送数据后,如果需要,您可以禁用接收器。

只需在活动中通过
registerReceiver
注册另一个
BroadcastReceiver
,它将监听您的事件,例如
com.example.SMS\u PARSED
。将您的短信息转换为
Parcelable
,放入
包中
,并将其发送给活动中注册的接收者。在那里,在
onReceive
中,您将
取消
进度


另外,不要忘记在出现错误时设置一个超时,这样用户就不会被您的进度阻塞。

启动ProgressDialog时,我会启用组件启用状态启用的接收器。当用户中止对话框时,不管是正数还是负数按钮,它都会停止接收器(就像我想要的那样)。现在我想,对话框也结束了,当收到来自定义号码的短信时,活动从中得到通知并获得短信文本。然后在发送数据后关闭活动onNewIntent()中的对话框