Notifiche di background Android con Firebase Cloud Messaging non ricevute

Ho cercato molto delle notifiche quando l'applicazione è in background o chiusa. Sto usando Firebase Cloud Messaging dal modo giusto. Non funziona per me. Ho usato l'installazione Android e quando l'applicazione è in primo piano o il telefono non è bloccato la notifica viene ricevuta.

  • Quando installato il token viene printingto correttamente e sottoscritto all'argomento.
  • Quando invio una notifica quando l'applicazione è triggers in primo piano (pertanto lo schermo è sbloccato e viene visualizzata l'applicazione) ricevo la notifica e il titolo come indicato in onMessageReceived .
  • Quando invio una notifica quando l'applicazione non viene visualizzata ma è ancora nelle applicazioni recenti e lo schermo è sbloccato, ricevo la notifica con titolo e messaggio come indicato nel notification payload .
  • Quando invio una notifica quando l'applicazione non viene mostrata ma è ancora nelle applicazioni recenti e lo schermo è bloccato, non viene ricevuto nulla.
  • Quando invio una notifica quando l'applicazione è * chiusa e rimossa dalle applicazioni recenti, non viene ricevuto nulla.

Come posso modificarlo in modo che l'applicazione riceva sempre le notifiche, anche quando è chiuso o il telefono è bloccato?

  • Android: memorizzare il nome utente e la password?
  • Perché non dovrebbe essere scritta un'applicazione Android in C / C ++ perché tu semplicemente preferisci programmare in C / C ++?
  • Come hide la mia applicazione ma non chiudere / finire
  • Autorizzazione READ_EXTERNAL_STORAGE per Android
  • onActivityResult () non viene chiamato in attività
  • GCM non è stato ricevuto dopo il minimo
  • Ps. Ho letto circa il modus Doze con applicazioni protette, anche quando ho messo la mia applicazione con quelle protette non riceve nulla. Sto testando su un Huawei P8 Lite.

    AndroidManifest

     <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" > <activity android:name=".activities.MainActivity" android:configChanges="orientation" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".services.MyAppFirebaseMessagingService" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> <service android:name=".services.FirebaseIDService" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service> <receiver android:name=".services.NotificationReceiver" /> </application> 

    Gradle

     dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.google.firebase:firebase-core:9.2.0' compile 'com.google.firebase:firebase-messaging:9.2.0' } apply plugin: 'com.google.gms.google-services' 

    FirebaseMessagingService

     public class MyAppFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "FCM Service"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO: Handle FCM messages here. // If the application is in the foreground handle both data and notification messages here. // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. Log.d(TAG, "From: " + remoteMessage.getFrom()); Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody()); showNotification(getApplicationContext()); } public static void showNotification(Context context){ Intent intent = new Intent(context, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("FCM Message") .setContentText("FCM Body") .setAutoCancel(true) .setSound(defaultSoundUri) .setPriority(Notification.PRIORITY_MAX) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0, notificationBuilder.build()); } } 

    FirebaseInstanceIDService

     public class FirebaseIDService extends FirebaseInstanceIdService { private static final String TAG = "FirebaseIDService"; @Override public void onTokenRefresh() { // Get updated InstanceID token. String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken); System.out.println("Devicetoken: " + refreshedToken); FirebaseMessaging.getInstance().subscribeToTopic("/topics/myapp"); // TODO: Implement this method to send any registration to your app's servers. sendRegistrationToServer(refreshedToken); } /** * Persist token to third-party servers. * * Modify this method to associate the user's FCM InstanceID token with any server-side account * maintained by your application. * * @param token The new token. */ private void sendRegistrationToServer(String token) { // Add custom implementation, as needed. } } 

    Payload di notifica

     { "to": "/topics/mytopic", "priority": "high", "notification": { "sound": "default", "badge": "1", "body": "the body text", "title": "title text" }, "data": { "id": "id", "channel": "channel" } } 

    EDIT – Aggiungi codice per WakeFulBroadcastReceiver

     public class NotificationReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // cancel any further alarms AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); alarmMgr.cancel(alarmIntent); completeWakefulIntent(intent); // start the GcmTaskService MyAppFirebaseMessagingService.showNotification(context); } } 

    UPDATE PAYLOAD

    Se cambio il mio payload al modo suggerito nei commenti come questo non funziona ancora. Forse ha qualcosa a che fare con il Huawei P8 Lite che stiamo testando con Android 6.0.1 installato.

     { "to": "/topics/mytopic", "priority": "high", "data": { "sound": "default", "badge": "1", "body": "the body text", "title": "title text" } } 

    UPDATE 2.0

    Ho testato su più dispositivi e versioni. Sui dispositivi con Android 5 funzionava bene, anche senza aprire e bloccare lo schermo. Solo il dispositivo non funzionava era il mio Huawei P8 Lite. Ancora non riesco a capire perché non funziona.

  • Come rilevare la modalità STAMINA?
  • Come posso fare un ProgressBar alla destra della barra degli strumenti?
  • Regolare la dimensione della window di dialogo personalizzata in android
  • Android aggiungendo nuovi xml e class
  • Individuazione del gesto di fling sul layout della griglia
  • Come analizzare il file complesso JSON in android
  • 2 Solutions collect form web for “Notifiche di background Android con Firebase Cloud Messaging non ricevute”

    Quando l'applicazione è chiusa, arresta il servizio. È necessario riavviare il servizio.

    Nella class Applicazione, implementa ActivityLifecycleCallbacks e su onActivityDestroyed riavviare il servizio con un allarme.

     public class YourApplication extends Application implements Application.ActivityLifecycleCallbacks { @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(this); } @Override public void onActivityDestroyed(Activity activity) { Intent restartService = new Intent(getApplicationContext(), MyAppFirebaseMessagingService.class); PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(),1,restartService,PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.ELAPSED_REALTIME,5000,pendingIntent); } } 

    Ho avuto anche problemi con i dispositivi che non ricevono le notifiche quando erano chiusi, come avrebbero dovuto dopo un riavvio.

    Fu fuori, non funzionava con una versione DEBUG della soluzione, quindi whereva essere testato in modalità RELEASE. Per coloro che utilizzano Android Studio, premi il button di riproduzione verde accanto al button di debug.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.