AlertDialog desde dentro de BroadcastReceiver ?? Se puede hacer?

AlertDialog desde dentro de BroadcastReceiver? Se puede hacer? Estoy trabajando en una aplicación que abrirá un cuadro de diálogo si recibo un mensaje SMS. Estoy intentando codificar esto dentro de un BroadcaseReceiver. Pero no puedo utilizar esta línea de código AlertDialog.Builder builder = new AlertDialog.Builder(this); . ¿Puede alguien ayudarme con una pista?

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

Problema principal: trate de evitar colocar funcionalidades que consumn mucho tiempo en BroadcastReceiver. Solo debe recibir e iniciar el procesamiento posterior en Actividad / Servicio enlazado.

ACTUALIZAR:

Por favor, consulte las siguientes fonts que pueden ser útiles:

Preguntas similares sobre StackOverflow:

¿Cómo enviar datos de BroadcastReceiver a una actividad en Android?

El receptor de Android SMS no funciona

Ejemplo de demostración de Android SDK:

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

Y, por supuesto, la documentación API de Android estándar: http://developer.android.com/reference/android/content/BroadcastReceiver.html

ACTUALIZACIÓN2:

Se agregó el esqueleto de la aplicación como debería verse. Tenga en cuenta que no se define ninguna vista de contenido. Es porque su aplicación tendrá una pantalla transparente. Para lograr eso

@android: estilo / Tema.Translúcido

se ingresa bajo la etiqueta de tema para esta actividad en 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(); } } }; } 

Estuve investigando y la documentación de BroadcastReceiver dice:

vacío público abstracto onReceive (contexto contextual, intención intencional)

Desde: API Nivel 1 Este método se invoca cuando BroadcastReceiver está recibiendo una transmisión intencionada. Durante este tiempo, puede usar los otros métodos en BroadcastReceiver para ver / modificar los valores de resultados actuales. Normalmente, la función se llama dentro del hilo principal de su proceso, por lo que nunca debe realizar operaciones de larga ejecución (hay un tiempo de espera de 10 segundos que el sistema permite antes de considerar que el receptor se bloqueará y un candidato será asesinado) . No puede iniciar un cuadro de diálogo emergente en su implementación de onReceive ().

No puede iniciar un cuadro de diálogo emergente en su implementación de onReceive ()

Entonces parece que no es posible

Esto es tarde pero esto puede ayudar a alguien.

No puede usar el diálogo de alerta dentro del receptor de difusión, podemos usarlo solo en actividad o servicio. Intenta así

En su método onReceive de receptor de difusión, agregue

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

y en su clase, configure su mensaje de diálogo para que aparezca cuando active el evento del receptor. Intenté esto y me funcionó. Espero que esto ayude a alguien 🙂

puede crear una nueva actividad transparente y luego crear Diálogo de alerta en esa actividad; cada vez que se muestre su alerta, llame a esa actividad desde su receptor de difusión, esto podría funcionar, no probado.

reemplace la palabra “this” dentro de AlertDilaog con “context” – el primer parámetro en su método onRecieve.

  public void onReceive(Context context, Intent intent)