BroadcastReceiver no funciona cuando la aplicación no se está ejecutando
En mi archivo de manifiesto he declarado el receptor. (como sigue)
<receiver android:name=".OnAlarmReceive" />
Sin embargo, una vez que cierro mi aplicación, no puedo obtener las alarmas y las notificaciones. Aparentemente, nunca se hace una llamada a OnReceive
en mi Broadcast receiver
.
- Notificación de Android Estilo de imagen grande y estilo de texto grande
- El icono de notificación de Lollipop es demasiado pequeño
- Controles del reproductor de medios en la notificación
- Notificación en Phonegap mientras la aplicación no se está ejecutando
- Escuchando la notificación en Android
public class OnAlarmReceive extends BroadcastReceiver { @Override public void onReceive(Context context, Intent arg1) { //various stuff } }
Dentro de MainActivity, mi clase de administrador de alarmas es como sigue.
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); Intent intent = new Intent("MY_ALARM_NOTIFICATION"); intent.setClass(this, OnAlarmReceive.class); intent.putExtra("message", message); PendingIntent pendingIntent = PendingIntent .getBroadcast(MainActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); Calendar timeCal = Calendar.getInstance(); timeCal.set(Calendar.HOUR_OF_DAY, hour); timeCal.set(Calendar.MINUTE, minutes); alarmManager.set(AlarmManager.RTC_WAKEUP, timeCal.getTimeInMillis(), pendingIntent);
Y mi manifiesto como sigue:
<receiver android:name=".OnAlarmReceive"> <intent-filter android:priority="1"> <action android:name="MY_ALARM_NOTIFICATION"/> </intent-filter> </receiver>
¿Qué debo hacer para recibir las notificaciones / alarmas aunque haya cerrado mi aplicación. Servicio de fondo?
- Cómo mostrar varias notificaciones en android
- Cómo controlar la frecuencia de actualización de la notificación en la pantalla bloqueada
- Servicio de descarga de Android personalizado: proporciona una fila de notificación de progreso por archivo
- Android getIntent () devuelve la primera intención
- Notificación de Android para intentar borrarlo
- Cómo mostrar mensajes emergentes sin tener un contexto
- Cancelación automática de la notificación en un momento determinado
- ¿Cuál es la diferencia entre C2DM y GCM
Debe agregar intención-filtro en manifiesto, como
receiver android:name=".SmsBroadCastReceiver"> <intent-filter android:priority="20"> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>
Como Gong Cong dice, usted necesita declarar qué eventos su receptor debe escuchar.
Por ejemplo :
<receiver android:name=".OnAlarmReceive"> <intent-filter> <action android:name="MY_ALARM_NOTIFICATION"/> </intent-filter> </receiver>
Y luego cuando su conjunto su alarma, utilice una intención con su acción:
Intent intent = new Intent("MY_ALARM_NOTIFICATION"); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); PendingIntent pi = PendingIntent.getBroadcast( this, 0, intent, 0 );
¡Tu código funciona bien!
Todo lo que tienes que hacer es cambiar esta línea:
alarmManager.set(AlarmManager.RTC_WAKEUP, timeCal.getTimeInMillis(), pendingIntent);
Con esta línea:
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 5000, pendingIntent);
Y el código en el "onReceive" se ejecutará después de 5000ms (5sec), incluso cuando la aplicación no se está ejecutando
En mi entendimiento, en algunos cased dependiendo de la forma de implementaciones, OS tiene autoridad para ajustar el tiempo de alarma establecido. Así que trate de usar AlarmManager.set (…), AlarmManager.setexact (…) etc en consecuencia. En algunos casos, dependiendo del fabricante (sistema operativo Android personalizado), existe la posibilidad de que el sistema operativo esté bloqueando la alarma de incendio.
La adición de android:exported="true"
para el receptor en el archivo de manifiesto me ayudó a recibir alarmas (y por lo tanto, despertar la aplicación) incluso cuando la aplicación se apagó (intencionalmente por mí, la eliminación de la aplicación de la lista de tareas).
1.Declare el receptor en el Manifest-file:
<receiver android:name="your.package.name.TestAlarmReceiver"></receiver>
Recuerde siempre que todo el sistema Android distingue entre mayúsculas y minúsculas. Así que compruebe que su ortografía es correcta en AndroidMainfest.xml.
2.Si usted crea un PendingIntent
para su receptor, agregue por favor un requestCode
– incluso es un número al azar! Sin su código onReceive
nunca se llama!
La función que iniciará AlarmManager
debería tener el siguiente aspecto:
public static void scheduleTestAlarmReceiver(Context context) { Intent receiverIntent = new Intent(context, TestAlarmReceiver.class); PendingIntent sender = PendingIntent.getBroadcast(context, 123456789, receiverIntent, 0); AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+startDelay, someDelay, sender); }
Clase BroadcastReceiver:
package your.package.name; public class TestAlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent arg1) { // your code here! } }
El artículo original: ¿Por qué mi BroadcastReceiver no se llama?
- Java.lang.NoClassDefFoundError: com.facebook.android.Facebook
- Obtener "com.android.ddmlib.AdbCommandRejectedException: closed" Exception?