AlertDialog изнутри BroadcastReceiver ?? Это можно сделать?

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(); } } 

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

ОБНОВИТЬ:

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

Похожие вопросы о StackOverflow:

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

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

Демо-пример Android SDK:

Android-СДК-windows \ Samples \ андроид-8 \ ApiDemos \ SRC \ COM \ пример \ Android \ APIs \ OS \ SmsMessagingDemo.java

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

UPDATE2:

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

@android: стиль / Theme.Translucent

вводится в теге Тема для этой активности в 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(); } } }; } 

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

public abstract void onReceive (контекстный контекст, намерение намерения)

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

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

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

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

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

В вашем методе onReceive трансляции

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

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

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

замените слово «this» внутри AlertDilaog «контекстом» – первым параметром на вашем методеRecieve.

  public void onReceive(Context context, Intent intent) 
  • Проверьте, четное или нечетное число
  • Использование неинициализированного конечного поля - с / без "этого". спецификатор
  • Как вернуть массив из JNI в Java?
  • Ошибка Java. Фактические и формальные списки аргументов различаются по длине
  • Что означает Java-вариант -Xmx?
  • org.openqa.selenium.WebDriverException: неизвестная ошибка: результат функции вызова отсутствует «значение»
  • Как приложение WhiteList в режиме «Доза» Android 6.0
  • Spinner onItemSelected () выполняет ненадлежащим образом
  • Код будет возвращать 0.0, 0.0 GPS-координату при бросании NullPointerException
  • Как правильно переопределить toString () на Java?
  • Возможна ли сумма ArrayList без цикла
  • Interesting Posts

    Как получить текущий номер строки?

    Как сделать моделирование наследования в реляционных базах данных?

    Аудио от VLC будет успокоиться при фокусировке других приложений

    «System.Net.Http.HttpContent» не содержит определения для «ReadAsAsync» и никакого метода расширения

    / Dev / fd0 в окнах. (Запись непосредственно на tar-дискету)

    ASP.NET MVC 3: переопределить атрибут «name» с помощью TextBoxFor

    Какие манипуляторы iomanip являются «липкими»?

    как мы можем использовать startActivityforResult () для намерения электронной почты?

    Не удается получить доступ к Tomcat с использованием IP-адреса

    Работа с данными в текстовом блоке в Silverlight / WP7

    Homebrew не устанавливает новые приложения в El Capitan

    Как предотвратить автоматическое изменение состояния процессора до 100%?

    Высокая производительность ATI Radeon HD 4650 в режиме работы от батареи

    Как вы запускаете .exe с параметрами с помощью оболочки vba ()?

    Еще один «driver_power_state_failure» на Win8.1 (с DUMP)

    Давайте будем гением компьютера.