android - segundo - Notificaciones Push cuando la aplicación está cerrada
notificaciones push en segundo plano android (8)
¿Sabe si es posible recibir notificaciones de un mensaje en la nube de Google cuando la aplicación está totalmente cerrada?
Sé si está abierto o en segundo plano, sí, pero ¿puede programarse de alguna manera para recibirlos?
EDITAR:
Sigo sin recibir notificaciones cuando la aplicación está cerrada.
Adjunto el código en caso de que haya 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 es cerrada con fuerza por el usuario: las notificaciones no llegan
¿Cuál es el problema?
Muchas gracias.
Cuando la aplicación está cerrada por el usuario, las notificaciones no llegan.
Es una característica de la plataforma Android. Forzar la detención de una aplicación por parte del usuario pone a la aplicación en un estado detenido y no se ejecuta ninguno de sus códigos, incluidos los receptores de difusión declarados en el manifiesto. Solo cuando el usuario inicia explícitamente la aplicación, se coloca en un estado en el que se activan los receptores.
Para más información: http://www.doubleencore.com/2014/06/effects-android-application-termination/
Acabo de terminar una aplicación GCM. Todavía funciona bien si cierras la aplicación. La cosa es que ya deberías haber abierto la aplicación por una vez. cree dos clases para lograr este objetivo: GcmBroadcastReceiver
y GcnIntentService
. Encuentre más información en 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 extiende es WakeFulBroadcastReceiver
. Hay un permiso WAKE_LOCK en su Manifest.xml. Esto permite utilizar WakeLocks
para evitar que el procesador entre en WakeLocks
o la pantalla se atenúe. Sin embargo, si extiendes BroadcastReceiver
, no funcionará después de que se cierre la aplicación.
<uses-permission android:name="android.permission.WAKE_LOCK" />
Después de algunas pruebas que hice sobre este problema, 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 todas las notificaciones cuando se cierra la aplicación. Sin embargo, si quita el cable del dispositivo y cierra la aplicación, cuando envíe la notificación, todo volverá a funcionar, ¡como debería!
En caso de que aparezca el mensaje emergente "Esperando al depurador", ¡solo reinicie el dispositivo y luego envíe una notificación de prueba!
Estaba teniendo el mismo problema en el teléfono Oneplus. Como lo mencionó mucha gente anteriormente, el problema fue la terminación forzosa de la aplicación. En mi caso, se hizo debido a la configuración de "Administración de aplicaciones recientes" como se muestra a continuación. Una vez que lo cambié a "Normal clear", todo comenzó a funcionar bien.
He estado probando otro teléfono y el segundo funcionó perfectamente, incluso cuando el teléfono estaba apagado. El primero tenía una habitación que no permitía recibir notificaciones cuando la aplicación estaba cerrada ... Gracias a todos.
La API de Firebase tiene dos tipos de mensajes, los llaman:
- notificación
- datos
Encuentra más información desde here
IMPORTANTE: No puede enviar mensajes de carga de datos desde la Consola Firebase , la Consola solo entrega un mensaje de notificación. Por lo tanto, he mencionado cómo enviar una notificación automática utilizando el cartero.
Debe enviar mensajes push con carga útil de datos debido a la carga útil de datos: no importa si su aplicación está en primer plano o en segundo plano o si está cancelada , estos mensajes siempre se enviarán al método onMessageReceived () .
En Android 8.0 Oreo, si la aplicación está cerrada, entonces no se recibe la notificación. Debido al modo DOZE y la optimización de la batería, solo tiene que apagar la optimización de la batería para todas las aplicaciones o aplicaciones en particular.
Apague la optimización de la batería para su aplicación en el siguiente paso:
Configuración >> Batería >> Optimización de la batería >> encuentre su aplicación >> seleccione >> si está optimizado, haga clic en no optimizar >> intente enviar una notificación
Enviar notificación push utilizando cartero
Paso 1: https://fcm.googleapis.com/fcm/send
Paso 2: establece estos dos en el encabezado
Autorización : clave = AIzaSyBuRl1Ikz3VXFvU7xW9mmg51lJ3uDSH
Tipo de contenido : aplicación / json
Paso 3: Enviar este json
{
"to" : "eb9HgFulyzU:APA91bFMLReWWwilNFfJ1fnXZ0A2PhJAYsabg-UcK_dHgHQcstTzcxLs4_mqgOmZtUiyLMne4JaOG7f8KH7pWxB7JugOGCCYgjd4fUynRBKZvNUgjaj2UdJB2Ux8VocszuUydCX",
"data" : {
"message" : "First Notification",
"title": "Push Notification",
"key_1" : "Key 1 value",
"key_2" : "Hello"
}
}
Espero que esto ayude..
Disfruta :) :)
No funcionará para matar la aplicación desde el administrador de tareas, pero funciona si simplemente la desliza para alejarla de reciente. Traté de hacer WhatsApp matándolo y le pedí a alguien que me enviara un mensaje y no recibí ninguna notificación. Entonces empecé la aplicación, y recibí una notificación.
Sí, es posible "recibir notificaciones de un mensaje en la nube de Google cuando la aplicación está totalmente cerrada".
De hecho, un receptor de difusión es el mecanismo que utiliza GCM para entregar mensajes. Debe tener implementado un BroadcastReceiver y declararlo en el AndroidManifest.xml.
Por favor, consulte el siguiente fragmento de código.
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 entrega un mensaje a su dispositivo, BroadcastReceiver
recibirá el mensaje y llamará a la función onReceive()
, en la que puede iniciar un servicio para que realice la tarea prevista.
El ejemplo de Código anterior utiliza un BroadcastReceiver
especializado llamado WakefulBroadcastReceiver
, que se asegura de que el dispositivo no se duerma, mientras el servicio está haciendo su trabajo.
Consulte la página oficial de Android para obtener el mismo: https://developer.android.com/google/gcm/client.html