【问题标题】:Waiting for Result from Broadcast Receiver等待广播接收器的结果
【发布时间】:2015-08-03 01:40:38
【问题描述】:

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

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

但是我怎样才能让它工作,当收到短信并将短信文本提供给活动时,对话框关闭?

我的 Activity 中的 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);
        }
    }
}

谢谢帮助

【问题讨论】:

    标签: android broadcastreceiver progressdialog


    【解决方案1】:

    你用你的标志禁用了接收器:

    PackageManager.COMPONENT_ENABLED_STATE_DISABLED。

    试试这个:

    PackageManager.COMPONENT_ENABLED_STATE_ENABLED

    然后在你的 Receiver onReceive 中,使用 Intent extras 将数据移动到 Activity,并使用 onNewIntent() 拦截它们。

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

    【讨论】:

    • 我在启动 ProgressDialog 时使用 COMPONENT_ENABLED_STATE_ENABLED 启用接收器。当用户中止对话框时,无论是正按钮还是负按钮,它都会停止接收器(这就像我想要的那样)。现在我想,对话也结束了,当从定义的号码收到短信时,活动会收到通知并获取短信文本。
    • 然后在发送数据后关闭Activity的onNewIntent()中的对话框
    【解决方案2】:

    只需通过registerReceiver 在您的活动中注册另一个BroadcastReceiver,它将监听您的事件,例如com.example.SMS_PARSED。将您的短信转换为Parcelable,输入Bundle,并将其发送给您在活动中注册的接收者。在onReceive 中,您将在dismiss 中取得进展。

    此外,不要忘记在出现错误时设置超时,以免用户被您的进度阻塞。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多