AlertDialog из BroadcastReceiver ?? Это можно сделать? - PullRequest
9 голосов
/ 30 января 2011

AlertDialog из BroadcastReceiver? Это можно сделать? Я работаю над приложением, которое выдает диалоговое окно, если я получаю SMS-сообщение. Я пытаюсь закодировать это в BroadcaseReceiver. Но я не могу использовать эту строку кода AlertDialog.Builder builder = new AlertDialog.Builder(this);. Может кто-нибудь, пожалуйста, помогите мне с подсказкой!

public class SMSPopUpReceiver extends BroadcastReceiver {

    private static final String LOG_TAG = "SMSReceiver";
    public static final int NOTIFICATION_ID_RECEIVED = 0x1221;
    static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";

    public void onReceive(Context context, Intent intent) {
        Log.i(LOG_TAG, "onReceive");

        if (intent.getAction().equals(SMSPopUpReceiver.ACTION)) {
            StringBuilder sb = new StringBuilder();
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
            Object[] pdus = (Object[]) bundle.get("pdus");

            for (Object pdu : pdus){
                    SmsMessage messages =
            SmsMessage.createFromPdu((byte[]) pdu);

            sb.append("Received SMS\nFrom: ");
            sb.append(messages.getDisplayOriginatingAddress());
            sb.append("\n----Message----\n");
            sb.append( messages.getDisplayMessageBody());
            }
            }
            Log.i(SMSPopUpReceiver.LOG_TAG,
            "[SMSApp] onReceiveIntent: " + sb);
            Toast.makeText
            (context, sb.toString(), Toast.LENGTH_LONG).show();
            }

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Are you sure you want to exit?")
               .setCancelable(false)
               .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       dialog.cancel();
                   }
               })
               .setNegativeButton("No", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                   }
               });
        AlertDialog alert = builder.create();
    }

}

Ответы [ 5 ]

14 голосов
/ 30 января 2011

Основная проблема: старайтесь не размещать трудоемкие функции в BroadcastReceiver.Он должен просто получить и инициировать дальнейшую обработку в связанной операции / услуге.

ОБНОВЛЕНИЕ:

Пожалуйста, проверьте следующие источники, которые могут быть полезны:

Подобные вопросы о StackOverflow:

Как отправить данные из BroadcastReceiver в Activity в Android?

Приемник Android SMS не работает

Пример демонстрации Android SDK:

android-sdk-windows \ samples \ android-8 \ ApiDemos \ src \ com \ example \ android \ apis \ os \ SmsMessagingDemo.java

И, конечно, стандартная документация по Android API: http://developer.android.com/reference/android/content/BroadcastReceiver.html

ОБНОВЛЕНИЕ2:

Добавлен скелет приложения, как он должен выглядеть.Обратите внимание, что просмотр содержимого не определен.Это потому, что ваше приложение будет иметь прозрачный экран.Для этого

@ android: style / Theme.Translucent

вводится под тегом Theme для этого действия в AndroidManifest.xml.

public class NotifySMSReceived extends Activity 
{
    private static final String LOG_TAG = "SMSReceiver";
    public static final int NOTIFICATION_ID_RECEIVED = 0x1221;
    static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        IntentFilter filter = new IntentFilter(ACTION);
        this.registerReceiver(mReceivedSMSReceiver, filter);
    }

    private void displayAlert()
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Are you sure you want to exit?").setCancelable(
                false).setPositiveButton("Yes",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                }).setNegativeButton("No",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });
        AlertDialog alert = builder.create();
        alert.show();
    }

    private final BroadcastReceiver mReceivedSMSReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

            if (ACTION.equals(action)) 
            {
                //your SMS processing code
                displayAlert();
            }
        }
    };    
}
7 голосов
/ 31 января 2011

Я искал это и документация BroadcastReceiver фактически говорит:

публичная аннотация void onReceive (Контекстный контекст, Намерение намерения)

Так как: API Уровень 1 Этот метод вызывается, когда BroadcastReceiver получение намеренной трансляции. В течение на этот раз вы можете использовать другой методы на BroadcastReceiver для просмотреть / изменить текущие значения результатов. Функция обычно вызывается в основной поток его процесса, так что вы никогда не должен выполнять длительный операции в нем (есть тайм-аут 10 секунд, что система позволяет прежде чем считать получателя заблокирован и кандидат будет убит). Вы не можете запустить всплывающее диалоговое окно в ваша реализация onReceive ().

Вы не можете запустить всплывающее диалоговое окно в Ваша реализация onReceive ()

Так что, кажется, это невозможно

3 голосов
/ 18 декабря 2013

Уже поздно, но это может кому-то помочь.

Вы не можете использовать диалоговое окно оповещения внутри приемника вещания, мы можем использовать это только в действии или услуге. Попробуйте вот так

В вашем методе приемника приемника добавьте

Intent i = new Intent(context, yourclass.class);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);

и в вашем классе установите диалоговое сообщение, чтобы оно появлялось при запуске события получателя. Я попробовал это, и это сработало у меня. Надеюсь, это кому-нибудь поможет: -)

0 голосов
/ 21 марта 2011

вы можете создать новое прозрачное действие, а затем создать диалоговое окно оповещения в этом действии, всякий раз, когда должно отображаться ваше оповещение, вызывайте это действие из вашего приемника вещания, это может работать, не проверено

0 голосов
/ 30 января 2011

замените слово «this» внутри AlertDilaog на «context» - первый параметр вашего метода onRecieve.

 public void onReceive(Context context, Intent intent)
...