10

Ho implementato Firebase e testato le notifiche Firebase. Quando l'applicazione è in primo piano non ho problemi, ho implementato un servizio che si estende FirebaseMessagingService e gestire il messaggio e dei dati in onMessageReceivedConsole Firebase: come specificare click_action per le notifiche

Ho problemi quando l'applicazione è in background, lo farei piace inviare una notifica che apre un'attività specifica e fa ciò che ho in programma di fare, non solo aprendo l'app.

Ho fatto come descritto nella guida di Firebase, ma non sono in grado di avviare l'attività specifica.

Ecco il manifesto:

<activity android:name=".BasicNotificationActivity"> 
      <intent-filter> 
       <action android:name="OPEN_ACTIVITY_1" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </activity> 

E qui il Console Firebase. Cosa devo scrivere in quei campi per aprire il mio "BasicNotificationActivity"?

Firebase console

+2

Il comportamento che descrivi è dispari. Secondo la documentazione (https://firebase.google.com/docs/notifications/android/console-device#receive_and_handle_messages) onMessageReceived dovrebbe * solo * essere chiamato se l'app è in * foreground * (come si dispone di notifica e carico utile dei dati). Quello che descrivi è che è il contrario. È corretto? –

+0

Mi dispiace, mi sono scambiato in primo piano e sfondo. Ho modificato la domanda. – Alex

+0

Possibile duplicato di [notifiche FCM Firebase fare clic su \ _action payload] (http://stackoverflow.com/questions/37407366/firebase-fcm-notifications-click-action-payload) –

risposta

18

Questo è un duplicato di questa domanda: Firebase FCM notifications click_action payload

Ma la risposta che è stata accettata dall'autore di questa domanda solo afferma che non è possibile con Firebase Console, ma è - con una soluzione facile. This answer by diidu alla stessa domanda spiega la soluzione che vorrei utilizzare.

UPDATE:
Per approfondire la sua risposta:

Aggiungere una classe di supporto (o implementare startActivity() metodo in qualche modo):

public class ClickActionHelper { 
    public static void startActivity(String className, Bundle extras, Context context){ 
     Class cls; 
     try { 
      cls = Class.forName(className); 
     }catch(ClassNotFoundException e){ 
      //means you made a wrong input in firebase console 
     } 
     Intent i = new Intent(context, cls); 
     i.putExtras(extras); 
     context.startActivity(i); 
    } 
} 

Nel lanciatore-attività della vostra app, chiamare un Mehtod per verificare eventuali nuovi intenti in onCreate() e onNewIntent() (onNewIntent() viene chiamato al posto di onCreate() se Activity viene avviato con flag single-top):

@Override 
protected void onCreate(Bundle bundle) { 
    [...] 
    checkIntent(getIntent()); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    [...] 
    checkIntent(intent); 
} 

public void checkIntent(Intent intent) { 
     if (intent.hasExtra("click_action")) { 
     ClickActionHelper.startActivity(intent.getStringExtra("click_action"), intent.getExtras(), this); 
     } 
} 

E in onMessageReceived():

public void onMessageReceived(RemoteMessage remoteMessage) { 
    Map<String, String> data = remoteMessage.getData();   
    if (data.containsKey("click_action")) { 
     ClickActionHelper.startActivity(data.get("click_action"), null, this); 
    } 
} 

per inviare una notifica con la console Firebase, mettere un valore di coppia di chiavi come dati personalizzati in questo modo:

Key: click_action 
Value: <fully qualified classname of your activity> 

Ora, quando una notifica viene ricevuto e cliccato, aprirà la tua attività. Se la tua app è in primo piano, cambierà immediatamente anche l'attività: sarebbe probabilmente utile chiedere all'utente se desidera andare a questa attività o meno (mostrando una finestra di dialogo in onMessageReceived()).

+0

In questa risposta non capisco dove mettere il codice che dovrebbe gestire i "dati personalizzati". – Alex

+0

Ho aggiornato la mia risposta. Questo sarebbe il modo in cui sono stati gestiti i dati personalizzati. In background, i dati personalizzati si trovano negli extra dell'intento che avvia l'attività di avvio. –

+0

onMessageReceived() hai menzionato, in quale classe deve essere inserito? Nel servizio che ho implementato per Firebase? O nella nuova classe che voglio aprire con la notifica? – Alex

0

ho anche il problema come u ma non ho ricevuto alcuna risposta giusta che sono i fatti che conosco,

  1. onNewIntent

questo metodo di sostituzione non è funziona quando l'applicazione è in corso coz di azione predefinita di lavoro è android.intent.action.MAIN

  1. Firebase Console

console Firebase non è abbastanza potere per gestire click_action che significa azione click non può non arrivare alla applicazione quando applicazione in sfondo.

  1. CURL

Curl sta lavorando in applicazione di sfondo, ma non può essere in primo piano non riesco a trovare.

curl --header "Authorization: key=<Colud_Messaging_Server_Key_here>" --header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send -d "{\"to\":\"dwdfosu6SDs:APA91bFWxZZB2f8AOgP9MG504cy5AhFECHGbYFfIzVixoAfy-ErT0NYQrREg150CbKYBtk3Ywpu7WQuWsQhk-VmoOe-0iDK3ZgaFZNvYxDuixZB8zQp0zydoXhyrMosi5C4eyBb7Ai1z\",\"notification\": {\"title\": \"Click Action Message\",\"text\": \"Sample message\",\"click_action\":\"noti\",\"ticket_download\":\"noti\"}}" 

Aggiungi Minifest

<activity 
    android:name=".activity.TicketDownload" 
    android:exported="true"> 
    <intent-filter> 
     <action android:name="noti" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</activity> 

nota: cloud_messaging_server_key è individuare l'impostazione> cloudmessaging

semmai fatti nuovi pls cerchiamo di sapere.

0

Ho utilizzato il metodo handleIntent(Intent intent) per gestire intent e passare a quella schermata specifica. Qui di seguito è il mio codice, che è perfettamente funzionante anche quando l'applicazione è in background:

FCMMessagingService.java che extends FCMMessagingService

@Override 
    public void handleIntent(Intent intent) { 
     super.handleIntent(intent); 

    Intent i = null; 
    String value_action = ""; 

     if (intent.getExtras() != null) { 
      if (key.equals("click_action")) { 
       value_action = intent.getExtras().getString(key); 
      } 

      i = new Intent(FCMMessagingService.this, MainActivity.class); 
      i.putExtra("notificationFlag", value_action); 
      i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

     } 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, notifCount, i, PendingIntent.FLAG_ONE_SHOT); 
     final int icon = R.mipmap.logo; 
    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this); 

    Notification notification; 
    notification = notificationBuilder.setSmallIcon(icon).setTicker(title) 
      .setAutoCancel(true) 
      .setContentTitle(title) 
      .setContentText(body) 
      .setSound(defaultSoundUri) 
      .setContentIntent(pendingIntent) 
      .setSmallIcon(R.mipmap.notification_icon) 
      .setLargeIcon(BitmapFactory.decodeResource(getResources(), icon)) 
      .build(); 


    notificationBuilder.setContentTitle(title); 
    notificationBuilder.setContentText(body); 
    notificationBuilder.setAutoCancel(true); 
    notificationBuilder.setSound(defaultSoundUri); 
    notificationBuilder.setContentIntent(pendingIntent); 
    notificationBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(), icon)); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     notificationBuilder.setSmallIcon(R.mipmap.logo); 
    } else { 
     notificationBuilder.setSmallIcon(R.mipmap.logo); 
    } 

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    notificationManager.notify(notifCount, notification); 

} 
Problemi correlati