2012-01-07 12 views
28

Buen día, estoy tratando de mostrar un cuadro de diálogo de alerta después de un reinicio del sistema en un receptor de difusión. He agregado el receptor en mi manifiesto y llamé al permiso requerido, pero recibo un error al mostrar el diálogo. Por favor, ¿Cómo puedo aplicar esto correctamente .. Graciasmuestra un diálogo de alerta en el receptor de difusión después de un reinicio del sistema

mi código:?

public void onReceive(final Context context, Intent intent) { 
    Log.d(TAG, "received boot completed broadcast receiver... starting settings"); 


    String settings = context.getResources().getString(R.string.restart_setting); 
     String yes = context.getResources().getString(R.string.Settings); 
     String no = context.getResources().getString(R.string.Cancel); 

       final AlertDialog.Builder builder = new AlertDialog.Builder(context); 
       builder.setMessage(settings) 
         .setCancelable(false) 
         .setPositiveButton(yes, new DialogInterface.OnClickListener() { 
    public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) 
    Intent config = new Intent(context, WeatherConfigure.class) 
    context.startActivity(config); 

    } 
}) 
    .setNegativeButton(no, new DialogInterface.OnClickListener() { 
     public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) { 
      dialog.cancel(); 
     } 
    }); 
    final AlertDialog alert = builder.create(); 
    alert.show(); 

    } 

estoy recibiendo este error de registro:

01-07 01:42:01.559: ERROR/AndroidRuntime(2004): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.view.ViewRoot.setView(ViewRoot.java:548) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at android.app.Dialog.show(Dialog.java:288) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at com.MuaaApps.MyWeatherUpdate.myWeatherBroadcastReceiver.onReceive(MyWeatherBroadcastReceiver.java:59) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.app.ActivityThread.handleReceiver(ActivityThread.java:1994) 
+0

Un mensaje de Toast o una notificación podría ser más apropiado en este caso, en lugar de disparar al usuario con un cuadro de diálogo de alerta cuando su teléfono se enciende. – cottonBallPaws

+0

@littleFluffyKitty, sí entiendo lo que quieres decir. Estoy probando diferentes escenarios para ver cuál creo que dará una buena experiencia de usuario, pero debo admitir que la sugerencia de notificación que hizo es una opción muy atractiva. no pensé en eso. Gracias – irobotxxx

Respuesta

38

El problema es que están tratando de mostrar una AlertDialog de a BroadcastReceiver, que no está permitido. No puede mostrar un AlertDialog de BroadcastReceiver. Solo las actividades pueden mostrar diálogos.

Debe hacer otra cosa, haga que el BroadcastReceiver comience en el arranque como lo hace y comience una actividad para mostrar el cuadro de diálogo.

Aquí hay un blog post más sobre esto.

EDIT:

Así es como yo recomendaría hacerlo. Desde su BroadcastReceiver iniciar una Activity con un AlertDialog como tal ..

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

Como se puede ver aquí que nunca llamó setContentView(). Esto se debe a que la actividad tendrá una vista transparente y solo se mostrará el cuadro de diálogo de alerta.

+0

Ok. Gracias por aclarar eso. Entonces, ¿eso significa que no es posible crear un cuadro de diálogo de alerta de un receptor de transmisión o solo en este tipo particular de transmisión? – irobotxxx

+0

Mira mi edición. –

+0

Gracias por el tiempo. notificaciones posteriores utilizadas – irobotxxx

7

Aquí hay un post sobre cómo hacerlo. Puede obtener el código fuente de here.

No puede mostrar el diálogo directamente desde su receptor de difusión. Tienes que usar un Activity. Además, para recibir ACTION_BOOT_COMPLETED su actividad debe ser iniciada explícitamente por el usuario o por otra aplicación (estado de la aplicación google detenido para más información).

Básicamente, para lograr la funcionalidad requerida, lo que necesita hacer:

  1. Crear actividad transparente que muestra el diálogo.
  2. Crea BroadcastReceiver que recibe ACTION_BOOT_COMPLETED y comienza tu actividad.
  3. Registre su receptor de difusión en el manifiesto y adquiera un permiso adecuado.

Además, this pregunta proporciona más información sobre cómo crear una actividad transparente.

+0

Es una gran publicación. Gracias, pero quiero mostrar el cuadro de diálogo después de activar el receptor desde el símbolo del sistema. Cómo lograr eso, aquí el el diálogo se muestra al principio. – AndroidOptimist

+0

Según tengo entendido, tu objetivo sigue siendo mostrar el diálogo de 'BroadcastReceiver'. La única diferencia es que su receptor se desencadena por otra intención (no 'android.intent.action.BOOT_COMPLETED'), ¿verdad? –

+0

Sí, tienes razón. Rectifiqué mi error :-) – AndroidOptimist

26

No se puede utilizar el diálogo en BroadcastReceiver, así que en vez que llaman una actividad mejor para el cuadro de diálogo de la BroadcastReceiver,

añadir este código en su función OnReceive:

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    Intent i = new Intent(context, {CLASSNAME}.class); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 
} 

llenar el {} CLASSNAME con la actividad de diálogo, aquí está mi actividad de diálogo:

package com.example.mbanking; 

import android.os.Bundle; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 


// ALERT DIALOG 
// Sources : http://techblogon.com/alert-dialog-with-edittext-in-android-example-with-source-code/ 

public class AlertDialogActivity extends Activity 
{ 

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

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder 
     .setTitle("Test") 
     .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(); 
} 
} 

donde obtuve la respuesta, aquí: How do you use an alert dialog box in a broadcast receiver in android? gracias a Femi !!, Acabo de difundir la noticia: D

+0

intenté pero no funciona para mí –

0

Esto puede ser viejo y respondió el hilo, pero la respuesta no fue útil en absoluto.

You cannot launch a popup dialog in your implementation of onReceive(). BroadcastReceiver

En lugar de diálogos o popupWindow, puede utilizar una actividad que tiene como tema de diálogo como

<activity 
    android:taskAffinity="" 
    android:name=".activity.CallActivity" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme.Dialog" /> 

Tenga en cuenta que yo añado taskAffinity interior del bloque (AndroidManifest.xml)

Luego puede usarlo como actividades normales.

Intent intentPhoneCall = new Intent(context, CallActivity.class); 
intentPhoneCall.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intentPhoneCall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(intentPhoneCall); 

Espero que ayude. Happy codings

3

La mejor manera es hacer una actividad y establecer su "Tema" atributo a "Theme.Translucen"

<activity 
     android:name=".MyAlertDialog" 
     android:label="@string/title_activity_alert_dialog" 
     android:launchMode="singleInstance" 
     android:theme="@android:style/Theme.Translucent" > 
    </activity> 

y en su actividad de crear un diálogo Alerta:

public class MyAlertDialog extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); //hide activity title 
    setContentView(R.layout.activity_my_alert_dialog); 

    AlertDialog.Builder Builder=new AlertDialog.Builder(this) 
      .setMessage("Do You Want continue ?") 
      .setTitle("exit") 
      .setIcon(android.R.drawable.ic_dialog_alert) 
      .setNegativeButton(R.string.No, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        MyAlertDialog.this.finish(); 
       } 
      }) 
      .setPositiveButton(R.string.Yes,null); 
    AlertDialog alertDialog=Builder.create(); 
    alertDialog.show(); 

} 

} 

y en brodcastreciver:

@Override 
public void onReceive(Context context, Intent intent) { 

    Intent i=new Intent(context.getApplicationContext(),MyAlertDialog.class); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 

} 
} 
0
  1. mostrar un diálogo de Broa El receptor dcast no es posible.
  2. deberíamos mostrar el Diálogo de Actividad solamente.
  3. Pero el contexto de su aplicación solo tiene Broadcast Receiver, entonces deberíamos iniciar la actividad como "FLAG_ACTIVITY_NEW_TASK", luego crea la pila.
  4. Si iniciamos la actividad con este indicador "FLAG_ACTIVITY_NEW_TASK", no podemos eliminarlo de la pila.

  5. Así que después de cerrar la aplicación, estamos tratando de iniciar la aplicación desde la pila, muestra la misma actividad, porque esta actividad tiene el indicador "FLAG_ACTIVITY_NEW_TASK", por lo que no debe crear la nueva instancia y usar instancia existente.

Pero queremos mostrar el diálogo solo una vez. para esto necesitamos manejar el aliado programático.

if (count == 0) { 
      mBuilder = new Dialog(this); 
      mMsg = getIntent().getStringExtra(AlarmSchedulerUtils.EXTRA_MSG); 
      Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
      mRingTome = RingtoneManager.getRingtone(ReminderDialog.this, notification); 
      mRingTome.play(); 
      count++; 
      showReminderDialog(); 
     } else { 
      Intent intent=new Intent(ReminderDialog.this,SplashActivity.class); 
      startActivity(intent); 
      finish(); 
     } 

Esto se trabajó para mí.

Cuestiones relacionadas