11

Sto verificando Firebase Cloud Messaging per inviare la notifica. Lo hanno già implementato e la sua notifica di ricezione quando l'app è in stato aperto. Ma se chiudo l'app, non ne viene più data la notifica. C'è qualche soluzione per questo.L'app Android non riceve la notifica FCM quando viene chiusa

Codice:

WebRequest wRequest; 
wRequest = WebRequest.Create("https://fcm.googleapis.com/fcm/send"); 
wRequest.Method = "post"; 
wRequest.ContentType = " application/json;charset=UTF-8"; 
wRequest.Headers.Add(string.Format("Authorization: key={0}", AppId)); 

wRequest.Headers.Add(string.Format("Sender: id={0}", SenderId)); 

string postData = "{\"registration_ids\":[\"" + regIds + "\"], \"data\": "+ value +"}"; 

Byte[] bytes = Encoding.UTF8.GetBytes(postData); 
wRequest.ContentLength = bytes.Length; 

Stream stream = wRequest.GetRequestStream(); 
stream.Write(bytes, 0, bytes.Length); 
stream.Close(); 

WebResponse wResponse = wRequest.GetResponse(); 

Messaging servizio-

public class MessagingService extends FirebaseMessagingService { 
    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData(); 
     sendNotification(data); 
    } 

    public void showMessage(Map<String, String> serverData) { 
     Intent i = new Intent(this,MainActivity.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

     PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT); 

     NotificationCompat.Builder builder = new NotificationCompat.Builder(this) 
       .setAutoCancel(true) 
       .setContentTitle(serverData.get("Title")) 
       .setContentText(serverData.get("Message")) 
       .setSmallIcon(R.drawable.common_google_signin_btn_icon_dark) 
       .setContentIntent(pendingIntent); 

     NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

     manager.notify(Integer.parseInt(serverData.get("ItemId")),builder.build()); 
    } 

    private void sendNotification(Map<String, String> serverData) { 
     Intent intent = new Intent(this, MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this,0 /* request code */, intent,PendingIntent.FLAG_UPDATE_CURRENT); 

     long[] pattern = {500,500,500,500,500}; 

     Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 

     NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this) 
       .setSmallIcon(R.drawable.common_google_signin_btn_icon_dark) 
       .setContentTitle(serverData.get("Title")) 
       .setContentText(serverData.get("Message")) 
       .setAutoCancel(true) 
       .setVibrate(pattern) 
       .setLights(Color.BLUE,1,1) 
       .setSound(defaultSoundUri) 
       .setContentIntent(pendingIntent); 

     NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     notificationManager.notify(Integer.parseInt(serverData.get("ItemId")), notificationBuilder.build()); 
    } 

} 

principale activity

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     FirebaseMessaging.getInstance().subscribeToTopic("test"); 
     FirebaseInstanceId.getInstance().getToken(); 
    } 
} 

Manifest-

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="test.com.firebasenotify"> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <service android:name=".MessagingService"> 
      <intent-filter> 
       <action android:name="com.google.firebase.MESSAGING_EVENT" /> 
      </intent-filter> 
     </service> 
     <service android:name=".InstanceIDService"> 
      <intent-filter> 
       <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> 
      </intent-filter> 
     </service> 

    </application> 

</manifest> 
+1

Visualizza FCM classe listener, e mostrare l'Inserisci richiesta si effettua a FCM –

+0

servizio di messaggistica aggiornamento, FCM postale e il codice attività principale –

+0

Ti visualizzato il messaggio nella OnReceive almeno? –

risposta

8

Nessun problema con il codice. Stavo usando Mi note 4 e in qualche modo non mostra notifiche in Mi4 quando l'app è chiusa. Ho provato con altri dispositivi Android e funziona bene.

Grazie a Tim Castelijns e Frank van Puffelen per aver partecipato alla conversazione.

+2

Per MI devi mettere l'app in modalità di avvio automatico in Sicurezza per ricevere notifiche quando l'app viene chiusa –

+0

Grazie man, in redmi prime2 si verifica anche lo stesso problema. Hai trovato qualche soluzione per questo problema nei dispositivi MI? – sandeepmaaram

-1

aggiungendo time_to_live chiave nella vostra Payload POST risolverà questo valore problem.The di questo parametro deve essere una durata da 0 a 2,4192 milioni secondo, e corrisponde al periodo massimo di tempo per il quale i negozi FCM e tentare di inviare il messaggio. "time_to_live": 3Refer Firebase Docs

+1

Questo è probabilmente valido solo se l'utente torna all'applicazione. – ioanb7

-3

Come da FCM docs onMessageReceived() non sarà chiamato quando app è in sfondo. Si dovrebbe inviare una notifica oggetto al fine di mostrare l'alto nel vassoio di sistema e quando l'utente fa clic l'lanciatore attività sarà aperta con i dati come comparse con l'intento . Per i carichi utili è necessario utilizzare l'oggetto dati. see docs e Receive Messages in an Android App

+2

se vedi il codice non ci sono oggetti di notifica. Sta solo inviando l'oggetto dati –

+0

è necessario inviare anche oggetto di notifica. – Sjd

+2

ma se invieremo l'oggetto di notifica, non verrà visualizzato su MessagingReceived e la notifica verrà gestita da Android stesso e verrà visualizzata nella barra delle notifiche (senza l'app client). E se inviamo un oggetto senza notifica ma l'oggetto dati è lì, verrà sempre visualizzato su MessagingReceived. –