studio notification notificaciones google gcm android google-cloud-messaging

android - notification - Mensajes de alta prioridad GCM no recibidos en modo inactivo profundo



notificaciones push android google cloud messaging gcm (3)

Debe usar WakefulBroadcastReceiver, que usa el método startWakefulService () para iniciar el servicio que hace el trabajo. Este método es comparable a startService (), excepto que WakefulBroadcastReceiver mantiene un bloqueo de activación cuando se inicia el servicio. La intención que se pasa con startWakefulService () contiene una identificación adicional del bloqueo de activación.

Paso 1: Extienda WakefulBroadcastReceiver en lugar de BroadcastReceiver.

Paso 2: startWakefulService en onReceive ()

Por favor, hágamelo saber para cualquier consulta.

Después de entrar en el modo de inactividad profunda usando:

adb shell dumpsys deviceidle force-idle

Estoy tratando de enviar al dispositivo un mensaje de alta prioridad, como lo sugiere la documentación , usando:

{"a": "feoLl37Ses4: A ....... hDQU1OZKd", "prioridad": "alto", "notificación": {"cuerpo": "Este es el cuerpo.", "título": "este es el título "," icono ":" nuevo "}}

El mensaje no se recibe. Solo después de cambiar el estado del dispositivo a IDLE_MAINTENANCE, se recibe el mensaje.

¿Cómo puedo hacer que el dispositivo reciba el mensaje incluso si está en modo inactivo profundo?


Sé que es una respuesta tardía, pero en caso de que alguien se encuentre con el mismo problema. Estaba experimentando el mismo problema y pasé algunas horas probando varias soluciones hasta que llegué a la conclusión de que no debería usar adb shell dumpsys deviceidle force-idle para ingresar al modo de inactividad profunda para probar sus notificaciones push, porque simplemente no estarán recibido (su dispositivo es forzado en modo inactivo profundo, pase lo que pase a menos que ejecute el comando unforce).

Si desea probar sus notificaciones push de alta prioridad en el modo inactivo profundo, utilice el adb shell dumpsys deviceidle step para pasar por todos los pasos hasta que alcance el modo inactivo profundo. Aquí hay un ejemplo.

adb shell dumpsys deviceidle get light ACTIVE adb shell dumpsys deviceidle step Stepped to deep: IDLE_PENDING adb shell dumpsys deviceidle get light INACTIVE adb shell dumpsys deviceidle step Stepped to deep: SENSING adb shell dumpsys deviceidle step Stepped to deep: LOCATING adb shell dumpsys deviceidle step Stepped to deep: IDLE adb shell dumpsys deviceidle get light OVERRIDE adb shell dumpsys deviceidle get deep IDLE

De esta manera, entrará en el modo de sueño profundo como en un caso real y sus impulsos se recibirán como se espera. Tenga en cuenta que antes de llamar al comando de pasos, debe ejecutar el adb shell dumpsys battery unplug y apagar la pantalla del dispositivo.

Mi conjetura adb shell dumpsys deviceidle force-idle es más fuerte ya que fuerza el modo inactivo incluso si la pantalla del dispositivo está encendida. Es totalmente engañoso en el doc oficial de Android cuando dicen "Puedes probar el modo Doze siguiendo estos pasos:" y te dicen que uses el comando force-idle. Debido a que la fuerza inactiva no funciona como la real y no hay ningún descargo de responsabilidad al respecto.


Si desea reactivar la aplicación desde el estado Doze (para que pueda recibir mensajes) use, setAndAllowWhileIdle() y setExactAndAllowWhileIdle() .

Su aplicación pasó al modo Doze cuando ejecutó el comando

adb shell dumpsys deviceidle force-idle

Restricciones de dormitar

Las siguientes restricciones se aplican a sus aplicaciones mientras está en Doze:

  1. El acceso a la red está suspendido.
  2. El sistema ignora los bloqueos de vigilia.
  3. Las alarmas de AlarmManager estándar (incluidos setExact () y setWindow ()) se difieren a la siguiente ventana de mantenimiento.
  4. Si necesita configurar alarmas que se activen mientras está en Doze, use setAndAllowWhileIdle () o setExactAndAllowWhileIdle ().
  5. Las alarmas configuradas con setAlarmClock () continúan disparándose normalmente: el sistema sale de Doze poco antes de que se activen esas alarmas.
  6. El sistema no realiza exploraciones de Wi-Fi.
  7. El sistema no permite que se ejecuten los adaptadores de sincronización.
  8. El sistema no permite que JobScheduler se ejecute

También es probable que la restricción Doze en el acceso a la red afecte a su aplicación, especialmente si la aplicación se basa en mensajes en tiempo real, como cosquillas o notificaciones . Si su aplicación requiere una conexión persistente a la red para recibir mensajes, debe usar Firebase Cloud Messaging (FCM) si es posible.

Para ayudar con la programación de las alarmas, Android 6.0 (nivel API 23) introduce dos nuevos métodos de AlarmManager: setAndAllowWhileIdle () y setExactAndAllowWhileIdle (). Con estos métodos, puede configurar alarmas que se activarán incluso si el dispositivo está en Doze.