Enviar notificaciones cuando la aplicación esté cerrada
¿Sabes si es posible recibir notificaciones del mensaje de nube de google cuando la aplicación está completamente cerrada?
Sé si está abierto o en el fondo sí, pero se puede programar de alguna manera con el fin de recibirlos?
- Abra la actividad haciendo clic en la notificación push de Parse
- Cordova PushPlugin - No se puede recibir notificación de GCM en android si la aplicación no se está ejecutando
- Notificación push en Amazon Android
- ¿Cómo puedo mostrar la notificación en la pantalla de bloqueo de Android?
- Google GCM: no recibe notificaciones push en android Lollipop
EDITAR:
Continúo sin recibir notificaciones cuando la aplicación se cierra.
Adjunto el código en caso de que tenga un error y no lo estoy viendo.
MANIFIESTO
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.frab" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="com.frab.permission.C2D_MESSAGE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.VIBRATE" /> <permission android:name="com.frab.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.frab.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".GGMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.something" /> </intent-filter> </receiver> <service android:name=".GCMIntentService" /> </application> </manifest>
RECEPTOR DE RADIODIFUSIÓN
package com.something; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.NotificationCompat; import android.util.Log; import com.activities.SignIn; import com.google.android.gcm.GCMBaseIntentService; import com.objects.Globals; public class GCMIntentService extends GCMBaseIntentService { private static final String TAG = "GGM <-----> FRAB"; private Bundle extras; public GCMIntentService() { super(Globals.SENDER_ID); } @Override public void onDestroy() { Log.d(TAG, "terminando servicio"); } @Override protected void onRegistered(Context context, String registrationId) { Log.i(TAG, "onRegistered: registrationId=" + registrationId); } @Override protected void onUnregistered(Context context, String registrationId) { Log.i(TAG, "onUnregistered: registrationId = " + registrationId); } @Override protected void onMessage(Context context, Intent data) { extras = data.getExtras(); String message = extras.getString("msg"); Log.d("******", message); sendNotification(message); } @Override protected void onError(Context arg0, String errorId) { Log.e(TAG, "onError: errorId = " + errorId); } } package com.something; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.support.v4.content.WakefulBroadcastReceiver; public class GGMBroadcastReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Explicitly specify that GcmIntentService will handle the intent. ComponentName comp = new ComponentName(context.getPackageName(), GCMIntentService.class.getName()); // Start the service, keeping the device awake while it is launching. startWakefulService(context, (intent.setComponent(comp))); setResultCode(Activity.RESULT_OK); } }
Cuando la aplicación está abierta: OK
Cuando la aplicación está en segundo plano: Ok
Cuando la aplicación se cierra con fuerza por el usuario: las notificaciones no llegan
¿Cuál es el problema?
Muchas gracias.
- Haga clic en notificación para ingresar mi aplicación en android
- Notificación de sonido, vibración y LED no funcionan
- ADB empuja varios archivos con la misma extensión con un solo comando
- Android: adb: copia el archivo a / system (Permiso denegado)
- OneSignal: no se puede abrir la actividad después de hacer clic en el botón
- Codificación de mensajes push de GCM
- ¿Son confiables las notificaciones push de Android?
- android parse dispositivo de notificación push registrado varias veces
Sí, es posible "recibir notificaciones del mensaje de nube de google cuando la aplicación está completamente cerrada".
De hecho, un receptor de difusión es el mecanismo que GCM utiliza para entregar mensajes. Necesitas implementar un BroadcastReceiver y declararlo en AndroidManifest.xml.
Consulte el fragmento de código siguiente.
AndroidManifest.xml
<receiver android:name=".GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <!-- Receives the actual messages. --> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.google.android.gcm.demo.app" /> </intent-filter> </receiver> <service android:name=".GcmIntentService" />
Código Java
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Explicitly specify that GcmIntentService will handle the intent. ComponentName comp = new ComponentName(context.getPackageName(), GcmIntentService.class.getName()); // Start the service, keeping the device awake while it is launching. startWakefulService(context, (intent.setComponent(comp))); setResultCode(Activity.RESULT_OK); } }
Cuando GCM envía un mensaje a su dispositivo, BroadcastReceiver
recibirá el mensaje y llamará a la función onReceive()
, en la que puede iniciar un servicio para realizar realmente la tarea prevista.
El ejemplo de código anterior utiliza un BroadcastReceiver
especializado llamado WakefulBroadcastReceiver
, que asegura que el dispositivo no se vaya a dormir mientras el servicio está haciendo su trabajo.
Consulte la página oficial de Android para obtener lo mismo: https://developer.android.com/google/gcm/client.html
Cuando la aplicación se cierra forcelly por el usuario: las notificaciones no llegan
Es una característica de la plataforma Android. Al detener una aplicación por parte del usuario, la aplicación se detiene y no se ejecuta ninguno de su código, incluidos los receptores de difusión declarados en el manifiesto. Sólo cuando el usuario inicia explícitamente la aplicación se coloca en un estado donde los receptores se disparó.
Para más información: http://www.doubleencore.com/2014/06/effects-android-application-termination/
No funcionará en matar a la aplicación del administrador de tareas, pero el trabajo si lo desliza fuera de reciente. Intenté hacerlo en whatsapp matándolo y pedirle a alguien que me enviara un msg, y no tengo ninguna notificación. Entonces empecé la aplicación, y recibí una notificación.
Acabo de terminar una aplicación de GCM. Aún funciona bien si cierra la aplicación. La cosa es que ya debería haber abierto la aplicación por una vez. Crear dos clases para lograr este objetivo: GcmBroadcastReceiver
y GcnIntentService
. Obtenga más información http://developer.android.com/google/gcm/index.html
Aquí está el truco
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Explicitly specify that GcmIntentService will handle the intent. ComponentName comp = new ComponentName(context.getPackageName(), GcmIntentService.class.getName()); // Start the service, keeping the device awake while it is launching. startWakefulService(context, (intent.setComponent(comp))); setResultCode(Activity.RESULT_OK); } }
La clase que se está extendiendo es WakeFulBroadcastReceiver
. Hay un permiso WAKE_LOCK en Manifest.xml. Esto permite que WakeLocks
evite que el procesador se WakeLocks
dormido o que la pantalla se atenúe. Sin embargo, si amplía BroadcastReceiver
, no funcionará después de cerrar la aplicación.
<uses-permission android:name="android.permission.WAKE_LOCK" />
He estado intentando otro teléfono y el segundo funcionó perfectamente, incluso cuando el teléfono estaba apagado. La primera tenía una habitación que no permitía ser notificado cuando la aplicación estaba cerrada … Gracias a todos
Después de algunas pruebas que hice sobre este tema, descubrí que se comporta de manera diferente sobre cómo se cierra la aplicación. Si cierra la aplicación mientras el cable está conectado al dispositivo, bloquea cada notificación cuando se cierra la aplicación. Sin embargo, si retira el cable del dispositivo y cierra la aplicación, al enviar la notificación, ¡todo funcionará de nuevo, como debería!
En caso de que obtenga un mensaje emergente "Esperando el depurador", reinicie el dispositivo y envíe una notificación de prueba.