Jak obsługiwać powiadomienia, gdy aplikacja w tle w Firebase

Oto mój manifest

    <service android:name=".fcm.PshycoFirebaseMessagingServices">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    <service android:name=".fcm.PshycoFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

Gdy aplikacja jest w tle i pojawia się Powiadomienie, pojawia się domyślne powiadomienie i nie uruchamia mojego kodu onMessageReceived.

Oto Mój kod. To wywołuje, jeśli moja aplikacja jest uruchomiona na pierwszym planie, a nie gdy aplikacja w tle. Jak uruchomić ten kod, gdy aplikacja jest w tle?
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): 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. See sendNotification method below.
    data = remoteMessage.getData();
    String title = remoteMessage.getNotification().getTitle();
    String message = remoteMessage.getNotification().getBody();
    String imageUrl = (String) data.get("image");
    String action = (String) data.get("action");
    Log.i(TAG, "onMessageReceived: title : "+title);
    Log.i(TAG, "onMessageReceived: message : "+message);
    Log.i(TAG, "onMessageReceived: imageUrl : "+imageUrl);
    Log.i(TAG, "onMessageReceived: action : "+action);

    if (imageUrl == null) {
        sendNotification(title,message,action);
    } else {
        new BigPictureNotification(this,title,message,imageUrl,action);
    }
}
// [END receive_message]
Author: AL., 2016-06-08

21 answers

1. Dlaczego to się dzieje?

W FCM (Firebase Cloud Messaging) występują dwa rodzaje wiadomości:]}
  1. Wyświetlanie wiadomości: te wiadomości wywołują callback onMessageReceived() tylko wtedy, gdy aplikacja znajduje się na pierwszym planie
  2. Wiadomości danych: wiadomości te wywołują onMessageReceived() callback nawet jeśli Twoja aplikacja jest w na pierwszym planie/tle / zabitym

Zespół Firebase nie opracował interfejsu użytkownika, aby wysłać {[5] } do twojego Urządzenia, jeszcze.

2. Jak?

Aby to osiągnąć, musisz wykonać POST żądanie na następujący adres URL:

POST https://fcm.googleapis.com/fcm/send

Nagłówki

  • Klucz: Content-Type, Wartość: application/json
  • Klucz: Authorization, Wartość: key=<your-server-key>

Body using topics

{
    "to": "/topics/my_topic",
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     }
}

Lub jeśli chcesz wysłać go do konkretnego urządzenia

{
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     },
    "registration_ids": ["{device-token}","{device2-token}","{device3-token}"]
}


Uwaga: upewnij się, że Nie dodajesz klucza JSON notification
Uwaga: aby uzyskać klucz serwera, możesz go znaleźć w konsoli firebase: Your project -> settings -> Project settings -> Cloud messaging -> Server Key

3. Jak obsługiwać wiadomość push notification?

Tak postępujesz z otrzymaną wiadomością:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();
     String myCustomKey = data.get("my_custom_key");

     // Manage data
}
 477
Author: Antonio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-17 11:38:27

Aby Biblioteka firebase wywołała twoje onmessagerecained () w następujących przypadkach

  1. Aplikacja na pierwszym planie
  2. Aplikacja w tle
  3. Aplikacja została zabita

NIE WOLNO umieszczać klucza JSON 'notification' w zapytaniu do API firebase, ale zamiast tego używać 'data', patrz poniżej.

Poniższy komunikat nie wywoła onmessagerecaired () Gdy twoja aplikacja jest w tle lub zabita, a nie możesz dostosować swojego powiadomienie.

{
   "to": "/topics/journal",
   "notification": {
   "title" : "title",
   "text": "data!",
   "icon": "ic_notification"
    }
}

Ale zamiast tego użycie tego zadziała

{
  "to": "/topics/dev_journal",
   "data": {
       "text":"text",
       "title":"",
       "line1":"Journal",
       "line2":"刊物"
   }
} 

Zasadniczo wiadomość jest wysyłana w argumencie RemoteMessage wraz z obiektem danych jako mapą, a następnie możesz zarządzać powiadomieniem w onmessagerec received jak w fragmencie tutaj

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();

     //you can get your text message here.
     String text= data.get("text");


     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
        // optional, this is to make beautiful icon
             .setLargeIcon(BitmapFactory.decodeResource(
                                    getResources(), R.mipmap.ic_launcher))  
        .setSmallIcon(smallIcon)  //mandatory
      .......
    /*You can read more on notification here:
    https://developer.android.com/training/notify-user/build-notification.html
    https://www.youtube.com/watch?v=-iog_fmm6mE
    */
}
 112
Author: Teerakiat Chitawattanarat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 12:29:32

Czuję, że wszystkie odpowiedzi są niekompletne, ale wszystkie z nich mają coś, czego potrzebujesz do przetworzenia powiadomienia, które mają DANE, gdy aplikacja jest w tle.

Wykonaj te kroki, a będziesz mógł przetwarzać powiadomienia, gdy aplikacja jest w tle.

1.Dodaj filtr intencyjny w ten sposób:

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

Do działania, które chcesz przetworzyć dane powiadomienia.

  1. Wysyłanie powiadomień z następnym format:

    { 
     "notification" : {
            "click_action" : ".MainActivity", 
            "body" : "new Symulti update !", 
            "title" : "new Symulti update !", 
            "icon" : "ic_notif_symulti" }, 
     "data": { ... },
     "to" : "c9Vaa3ReGdk:APA91bH-AuXgg3lDN2WMcBrNhJZoFtYF9" }
    

Kluczem tutaj jest add

"click_action" : ".MainActivity"

Gdzie .MainActivity to aktywność z filtrem intencyjnym dodanym w kroku 1.

  1. Pobierz" dane " informacje z powiadomienia w onCreate z ".Główna": {]}

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //get notification data info
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
           //bundle must contain all info sent in "data" field of the notification
        }
    }
    
I to powinno być wszystko, co musisz zrobić. Mam nadzieję, że to komuś pomoże:)
 61
Author: Daniel S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 12:35:26

Zgodnie z docs

Obsługa wiadomości w aplikacji

Gdy aplikacja jest w tle, Android kieruje powiadomienia Wiadomości do zasobnika systemowego. Dotknięcie przez użytkownika powiadomienia otwiera domyślnie uruchamianie aplikacji.

Obejmuje to wiadomości, które zawierają zarówno powiadomienie, jak i dane ładunek. W takich przypadkach powiadomienie jest dostarczane do urządzenia zasobnika systemowego, a dane są dostarczane w dodatkach cel działania wyrzutni.

Jeśli chcesz otworzyć aplikację i wykonać określoną akcję, Ustaw click_action w powiadomieniu i mapowanie go w celu filtruj aktywność, którą chcesz uruchomić. Na przykład zestaw click_action to OPEN_ACTIVITY_1 to trigger an intent filter like the "following": {]}

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

Edit:

Na podstawie tego wątku :

Nie można ustawić ładunku click_action za pomocą konsoli Firebase. Możesz spróbować przetestować z poleceniem curl lub niestandardowym serwerem http

curl --header "Authorization: key=<YOUR_KEY_GOES_HERE>" 
     --header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send  
     -d "{\"to\":\"/topics/news\",\"notification\": 
         {\"title\": \"Click Action Message\",\"text\": \"Sample message\",
            \"click_action\":\"OPEN_ACTIVITY_1\"}}"
 28
Author: Shubhank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 12:37:18

Zgodnie z dokumentacją firebase w wysyłamy za pomocą firebase , istnieje 2 typ ładunku:

  1. Dane

    Ten parametr określa niestandardowe pary klucz-wartość ładunku wiadomości. Aplikacja kliencka jest odpowiedzialna za przetwarzanie wiadomości danych. Wiadomości danych mają tylko niestandardowe pary klucz-wartość.

  2. Notification

    Parametr ten określa predefiniowany, widoczny przez użytkownika pary klucz-wartość ładunku powiadomienia. FCM automatycznie wyświetla komunikat na urządzeniach użytkowników końcowych w imieniu aplikacji klienckiej. Wiadomości powiadomień mają predefiniowany zestaw widocznych przez użytkownika kluczy.

Gdy jesteś na pierwszym planie, możesz pobrać dane z FCM za pomocą onmessagerecaired () , możesz pobrać dane z data.

data = remoteMessage.getData();
String customData = (String) data.get("customData");

Gdy jesteś w tle, FCM wyświetli powiadomienie w zasobniku systemowym na podstawie informacji z zawiadomienie Tytuł, wiadomość i ikona, które są używane do powiadomienia na pasku zadań, są pobierane z ładunku notification.

{
  "notification": {
        "title" : "title",
        "body"  : "body text",
        "icon"  : "ic_notification"
       }
}

This notification payload są używane, gdy chcesz automatycznie wyświetlać powiadomienia na pasku zadań, gdy aplikacja jest w tle. Aby uzyskać dane powiadomień, gdy aplikacja jest w tle, należy dodać click_action wewnątrz notification payload.

Jeśli chcesz otworzyć Twoja aplikacja i wykonaj określone działanie [w tle], Ustaw click_action w ładunku powiadomień i Mapuj je do filtra intencyjnego w aktywności, którą chcesz uruchomić. Na przykład ustaw click_action na open_activity_1, aby uruchomić filtr intencyjny, taki jak:

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

Umieść ten filtr intencji w manifeście, wewnątrz znacznika aplikacji. Po kliknięciu powiadomienia otworzy się aplikacja i przejdzie od razu do aktywności zdefiniowanej w click_action, w tym przypadku "OPEN_ACTIVTY_1". A wewnątrz tej aktywności można uzyskać dane przez:

Bundle b = getIntent().getExtras();
String someData = b.getString("someData");

Używam FCM dla mojej aplikacji na Androida i używam obu ładunków. Oto przykład JSON, którego używam:

{
  "to": "FCM registration ID",
  "notification": {
    "title" : "title",
    "body"  : "body text",
    "icon"  : "ic_notification"
   },
   "data": {
     "someData"  : "This is some data",
     "someData2" : "etc"
   }
}
 17
Author: Hendy Evan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-25 15:32:04

Ponieważ display-messages, które są wysyłane z Firebase Notification UI działa tylko wtedy, gdy aplikacja jest na pierwszym planie. Dla data-messages istnieje potrzeba wykonania połączenia pocztowego do FCM

Kroki

  1. Zainstaluj Advanced Rest Client Rozszerzenie Google Chrome Tutaj wpisz opis obrazka

  2. Dodaj następujące nagłówki

    Key: Content-Type, Value : application / json

    Key: Authorization, Value : key= " your klucz serwera" Tutaj wpisz opis obrazka

  3. Dodaj ciało

    • Jeśli używasz tematów:

      {
          "to" : "/topics/topic_name",
          "data": {
          "key1" : "value1",
          "key2" : "value2",
          }
      }
      
    • Jeśli używasz identyfikatora rejestracji:

      {
          "registration_ids" : "[{"id"},{id1}]",
          "data": {
          "key1" : "value1",
          "key2" : "value2",
           }
      }
      

To jest to!. Teraz posłuchaj onMessageReceived callback jak zwykle.

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();
     String value1 = data.get("key1");
     String value2 = data.get("key2");
}
 14
Author: Anirudh Ramanan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 10:04:30
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

}

Nie jest wywoływana za każdym razem, gdy jest wywoływana tylko wtedy, gdy aplikacja jest w forground

Istnieje jedna metoda nadpisywania ta metoda jest wywoływana za każdym razem, bez względu na to, jaka aplikacja jest na pierwszym planie, w tle lub zabita, ale ta metoda jest dostępna z tą wersją firebase api

To jest wersja, którą musisz zaimportować z gradle

compile 'com.google.firebase:firebase-messaging:10.2.1'

Jest to metoda

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

    // you can get ur data here 
    //intent.getExtras().get("your_data_key") 


}

W poprzednim firebase api tej metody nie było więc w takim przypadku fire base obsługuje się, gdy aplikacja jest w tle .... teraz masz tę metodę co chcesz zrobić... możesz to zrobić tutaj w tej metodzie .....

Jeśli używasz poprzedniej wersji, domyślna aktywność zostanie uruchomiona w takim przypadku u można uzyskać dane w ten sam sposób

if(getIntent().getExtras() != null && getIntent().getExtras().get("your_data_key") != null) {
String strNotificaiton = getIntent().getExtras().get("your_data_key").toString();

// do what ever u want .... }

Ogólnie taką strukturę z serwera otrzymujemy w powiadomieniu

{
    "notification": {
        "body": "Cool offers. Get them before expiring!",
        "title": "Flat 80% discount",
        "icon": "appicon",
        "click_action": "activity name" //optional if required.....
    },
    "data": {
        "product_id": 11,
        "product_details": "details.....",
        "other_info": "......."
    }
}

To zależy od tego, jak chcesz dać ten klucz danych lub chcesz dać powiadomienie, cokolwiek możesz dać ....... what ever u will daj tutaj z tym samym kluczem u dostanie te dane .........

Istnieje kilka przypadków, jeśli u r Nie wysyłanie akcji kliknięcia w tym przypadku, gdy u kliknie na powiadomieniu domyślna aktywność zostanie otwarta, ale jeśli chcesz otworzyć określoną aktywność, gdy aplikacja jest w tle, u można wywołać aktywność z tej metody handleIntent, ponieważ jest ona wywoływana za każdym razem

 13
Author: Avinash Jadaun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 12:41:02

Aby uchwycić wiadomość w tle, musisz użyć BroadcastReceiver

public class FirebaseDataReceiver extends WakefulBroadcastReceiver {

    private final String TAG = "FirebaseDataReceiver";

    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "I'm in!!!");
        Bundle dataBundle = intent.getBundleExtra("data");
        Log.d(TAG, dataBundle.toString());
    }
}

I dodaj to do manifestu:

<receiver
      android:name="MY_PACKAGE_NAME.FirebaseDataReceiver"
      android:exported="true"
      android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
</receiver>
 12
Author: Romulano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 10:08:16

Oto bardziej jasne pojęcia dotyczące wiadomości firebase. Znalazłem to od ich zespołu wsparcia.

Firebase posiada trzy typy wiadomości :

Powiadomienia : powiadomienia działają w tle lub na pierwszym planie. Gdy aplikacja jest w tle, powiadomienia są dostarczane do zasobnika systemowego. Jeśli aplikacja znajduje się na pierwszym planie, wiadomości są obsługiwane przez wywołania zwrotne onMessageReceived() lub didReceiveRemoteNotification. Są to zasadniczo to, co nazywa się wyświetlaczem wiadomości.

Wiadomości danych: na platformie Android Wiadomości danych mogą działać w tle i na pierwszym planie. Wiadomość z danymi będzie obsługiwana przez onmessagerec received (). Uwaga dotycząca platformy brzmiałaby: na Androidzie ładunek danych można pobrać w intencji użytej do uruchomienia aktywności. Aby rozwinąć, jeśli masz "click_action":"launch_Activity_1", możesz pobrać tę intencję przez getIntent() z only Activity_1.

Wiadomości z powiadomieniami i danymi: gdy w tle, aplikacje otrzymują ładunek powiadomienia w zasobniku powiadomień i obsługują ładunek danych tylko wtedy, gdy użytkownik dotknie powiadomienia. Na pierwszym planie aplikacja otrzymuje obiekt wiadomości z dostępnymi obydwoma ładunkami. Po drugie, parametr click_action jest często używany w ładunku powiadomień, a nie w ładunku danych. Jeśli zostanie użyty wewnątrz ładunku danych, parametr ten będzie traktowany jako niestandardowa para klucz-wartość i dlatego trzeba będzie zaimplementować niestandardową logikę, aby działał jako zamierzony.

Zalecam również użycie metody onMessageReceived (Zobacz wiadomość z danymi) do wyodrębnienia pakietu danych. Z Twojej logiki sprawdziłem obiekt bundle i nie znalazłem oczekiwanej zawartości danych. Tutaj jest odniesienie do podobnego przypadku, który może zapewnić większą jasność.

Po Więcej informacji odwiedź mój ten wątek

 8
Author: Md. Sajedul Karim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:31

2017 zaktualizowana odpowiedź

Oto jednoznaczna odpowiedź z docs na ten temat:

Tutaj wpisz opis obrazka

 7
Author: pulp_fiction,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-28 20:29:47

Według dokumentów: 17 maja 2017

Gdy twoja aplikacja jest w tle , Android kieruje wiadomości powiadomień do zasobnika systemowego. Dotknij użytkownika na powiadomienie otwiera App launcher domyślnie .

Obejmuje to wiadomości zawierające zarówno powiadomienie, jak i dane (oraz wszystkie wiadomości wysyłane z konsoli powiadomień). W tych przypadki, powiadomienie jest dostarczane do zasobnika systemowego urządzenia, oraz dane ładunek jest dostarczany w dodatkach z intencji twojego aktywność wyrzutni.

Więc powinieneś użyć obu powiadomień o ładunku + danych:

{
  "to": "FCM registration ID",
  "notification": {
    "title" : "title",
    "body"  : "body text",
    "icon"  : "ic_notification"
   },
   "data": {
     "someData"  : "This is some data",
     "someData2" : "etc"
   }
}

Nie ma potrzeby używania click_action.Należy po prostu pobrać exras z intent on Launcher activity

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

Kod Javy powinien być na metodzie OnCreate na MainActivity:

Intent intent = getIntent();
if (intent != null && intent.getExtras() != null) {
    Bundle extras = intent.getExtras();
    String someData= extras.getString("someData");
    String someData2 = extras.getString("someData2");
}

Możesz przetestować oba powiadomienia o ładunku + dane z Firebase Notifications Console . Nie zapomnij wypełnić niestandardowe pola danych w sekcji Opcje zaawansowane

 6
Author: Mihuilk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 12:42:30

Rozgryzłem scenariusze,

Gdy aplikacja jest na pierwszym planie , metoda onmessagerecaired() jest wywoływana z FirebaseService. tak więc zostanie wywołana pendingIntent zdefiniowana w klasie service.

I gdy aplikacja jest w tle , pierwsza aktywność jest wywoływana.

Teraz, jeśli użyjesz Splash activity , to musi pamiętać o wywołaniusplashactivity , w przeciwnym razie jeśli nie ma splashActivity, wtedy niezależnie od pierwszej aktywności, będzie nazywany.

Następnie należy sprawdzićgetIntent () zfirst activity , aby sprawdzić, czy ma ona jakiśpakiet .jeśli wszystko jest w porządku, zobaczysz, że pakiet jest tam z wypełnionymi wartościami. Jeśli wartość w znaczniku danych wysłanym z serwera wygląda tak,

"data": {
    "user_name": "arefin sajib",
    "value": "user name notification"
  }

Wtedy w pierwszym ćwiczeniu zobaczysz, istnieje valid intent (getIntent () nie jest null ), valid bundle i inside bundle , będzie cały wspomniany wyżej JSON z danymi jako klucz.

W tym scenariuszu kod do ekstrakcji wartości będzie wyglądał tak,

    if(getIntent()!=null){
            Bundle bundle = getIntent().getExtras();
            if (bundle != null) {
                try {
                   JSONObject object = new JSONObject(bundle.getStringExtra("data"));
String user_name = object.optString("user_name");

                } catch (JSONException e) {
                    e.printStackTrace();
                }


            }
        }
 5
Author: Shamsul Arefin Sajib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-02 04:55:38

Proste podsumowanie jak to

  • Jeśli Twoja aplikacja jest uruchomiona;

    onMessageReceived()
    

Jest wyzwalaczem.

  • Jeśli Twoja aplikacja nie działa (zabita przez przesuwanie);

    onMessageReceived()
    

Nie jest uruchamiany i dostarczany przez direclty. Jeśli masz jakąś specjalną parę klucz-wartość. Nie działają, ponieważ onmessagerec received () nie działa.

I' ve found this way;

W swojej aktywności launcher, umieścić tę logikę,

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState, R.layout.activity_splash);

    if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("PACKAGE_NAME")) {

        // do what you want

        // and this for killing app if we dont want to start
        android.os.Process.killProcess(android.os.Process.myPid());

    } else {

        //continue to app
    }
}

In this if block, wyszukaj klucze zgodnie z interfejsem firebase.

W tym przykładzie mój klucz i wartość jak wyżej; (sorry za język =)) Tutaj wpisz opis obrazka

Kiedy mój kod działa, dostaję " com.rda.Uwaga".
android.os.Process.killProcess(android.os.Process.myPid());

Z tej linii kodu, zamknąłem moją aplikację i otworzyć Google Play Market

Happy coding =)

 4
Author: Arda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-19 11:26:19

Usuń notification payload całkowicie z żądania serwera. Wyślij tylko DANE i obsłuż je w onMessageReceived(), w przeciwnym razie twoje onMessageReceived nie zostanie uruchomione, gdy aplikacja jest w tle lub zabita.

Oto co wysyłam z serwera:

{
  "data":{
    "id": 1,
    "missedRequests": 5
    "addAnyDataHere": 123
  },
  "to": "fhiT7evmZk8:APA91bFJq7Tkly4BtLRXdYvqHno2vHCRkzpJT8QZy0TlIGs......"
}

Więc możesz odbierać swoje dane w onMessageReceived(RemoteMessage message) w następujący sposób: (powiedzmy, że muszę uzyskać identyfikator)

Object obj = message.getData().get("id");
        if (obj != null) {
            int id = Integer.valueOf(obj.toString());
        }

I podobnie możesz uzyskać dowolne dane, które wysłałeś z serwera w onMessageReceived().

 2
Author: Zohab Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-17 11:59:44

Łatwy sposób wysyłania wiadomości, nawet jeśli aplikacja jest w tle i na pierwszym planie, jak następuje:- Aby wysłać wiadomość za pomocą API, można użyć narzędzia o nazwie AdvancedREST Client, jego rozszerzenie chrome, i wysłać wiadomość z następującymi parametrami.

Rest client tool Link: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo

Użyj tego adresu url:- https://fcm.googleapis.com/fcm/send Content-Type:application / json Authorization: key=Your Server key From or authoization key (patrz niżej ref)

{ "data": {
    "image": "https://static.pexels.com/photos/4825/red-love-romantic-flowers.jpg",
    "message": "Firebase Push Message Using API"
    "AnotherActivity": "True"
     },
  "to" : "device id Or Device token"
}

Klucz autoryzacyjny można uzyskać, odwiedzając konsolę programistów Google i klikając przycisk poświadczenia w lewym menu dla swojego projektu. Wśród wymienionych kluczy API klucz serwera będzie Twoim kluczem autoryzacyjnym.

I musisz umieścić tokenID odbiornika w sekcji " do " twojego żądania POST wysłanego za pomocą API.

 2
Author: Syed Danish Haider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 12:43:45

Dziękuję wszystkim za odpowiedzi. Ale rozwiązałem to wysyłając wiadomość z danymizamiast wysyłania powiadomienia. Kod serwera

<?php
$url = "https://fcm.googleapis.com/fcm/send";
$token = "C-l6T_a7HouUK****";
$serverKey = "AAAAaOcKS00:********";
define( 'API_ACCESS_KEY', $serverKey );
$registrationIds = array($token);
// prep the bundle

$msg = array

(
 'message'  => 'here is a message. message',
 'title'        => 'This is a title. title',
 'subtitle' => 'This is a subtitle. subtitle',
 'tickerText'   => 'Ticker text here...Ticker text here...Ticker text 
 here',
 'vibrate'  => 1,
 'sound'        => 1,
 'largeIcon'    => 'large_icon',
 'smallIcon'    => 'small_icon'

);

$fields = array

(
  'registration_ids'    => $registrationIds,
  'data'            => $msg

);
$headers = array

(
  'Authorization: key=' . API_ACCESS_KEY,
 'Content-Type: application/json'

);


$ch = curl_init();

curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' 
);

curl_setopt( $ch,CURLOPT_POST, true );

curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );

curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );

curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );

curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );

$result = curl_exec($ch );

curl_close( $ch );

echo $result;

?>

i przechwycił dane w onmessagerec received

public class MyFirebaseMessagingService extends FirebaseMessagingService     {

  private static final String TAG = "MyFirebaseMsgService";

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

      sendNotification(remoteMessage.getData().get("message"));
     }
   // Check if message contains a notification payload.
    else if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    sendNotification(remoteMessage.getNotification().getBody());
    }


}
   private void sendNotification(String messageBody) {
    Intent intent = new Intent(this, Notify.class).putExtra("msg",messageBody);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    String channelId = "idddd";
    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(MyFirebaseMessagingService.this)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle("FCM Message")
                    .setContentText(messageBody)
                    .setAutoCancel(true)
                    .setSound(defaultSoundUri)
                    .setContentIntent(pendingIntent);

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

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
 2
Author: Android Sanaullah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-25 12:09:54

Czerwiec 2018 Odpowiedź-

Musisz upewnić się, że nigdzie w wiadomości nie ma słowa kluczowego "powiadomienie". Dołącz tylko "dane", a aplikacja będzie w stanie obsłużyć wiadomość w onmessagerec received, nawet jeśli w tle lub zabity.

Korzystanie Z Funkcji Chmury:

const message = {
    token: token_id,   // obtain device token id by querying data in firebase
    data: {
       title: "my_custom_title",
       body:  "my_custom_body_message"
       }
    }


return admin.messaging().send(message).then(response => {
    // handle response
});

Następnie w onmessagerec (), w klasie rozszerzającej com.google.baza ogniowa.wiadomości.FirebaseMessagingService:

if (data != null) {
  Log.d(TAG, "data title is: " + data.get("title");
  Log.d(TAG, "data body is: " + data.get("body");
}

// build notification using the body, title, and whatever else you want.
 1
Author: Jeff Padgett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-26 03:29:48

Za pomocą tego kodu można uzyskać powiadomienie w tle/na pierwszym planie, a także umieścić akcję:

//Data should come in this format from the notification
{
  "to": "/xyz/Notifications",
  "data": {
      "key1": "title notification",
      "key2": "description notification"
  }
}

W aplikacji Użyj tego kodu:

  @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
      String key1Data = remoteMessage.getData().get("key1");
      // use key1Data to according to your need
    }
 1
Author: Ashish Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-20 07:58:00

Chcesz pracować onmessagerecaired (RemoteMessage remoteMessage) w tle wysyłać tylko dane część powiadomienia część to:

"data":    "image": "",    "message": "Firebase Push Message Using API", 

"another activity": "True", "to": "device id Or Device token"

Przez ten onMessageRecivied jest tłem wywołania i pierwszym planie nie trzeba obsługiwać powiadomienia za pomocą tray powiadomień o aktywności launchera. Obsługa ładunku danych przy użyciu tego:
Public void onMessageReceived (RemoteMessage remoteMessage) jeśli (remoteMessage.getData ().rozmiar() > 0) Log.d (TAG, "Message data payload:" + remoteMessage.getData());

 1
Author: user3385125,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-12 09:36:20

Oprócz powyższych odpowiedzi, Jeśli testujesz powiadomienia push za pomocą FCM console, klucz "data" i obiekt są dodane do pakietu powiadomień Push , a nie. Więc nie otrzymasz szczegółowych powiadomień push, gdy aplikacja jest w tle lub zabity.

W tym przypadku musisz wybrać konsolę administratora zaplecza, aby przetestować scenariusz w tle aplikacji.

Tutaj dodasz klucz "data" do swojego pakietu push. tak więc szczegółowe naciśnięcie zostanie pokazane zgodnie z oczekiwaniami. Mam nadzieję, że to pomoże kilka.

 0
Author: Max Droid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-27 17:29:03

Doświadczyłem tego samego problemu i przekompilowałem bibliotekę firebase i uniemożliwiłem jej wysyłanie powiadomień, gdy aplikacja jest w tle

*biblioteka https://github.com/erdalceylan/com-google-firebase-messaging

 dependencies {
        compile 'com.google.firebase:firebase-core:11.2.0'
        compile 'com.github.erdalceylan:com-google-firebase-messaging:v1-11.2.0'
    }

*

@WorkerThread
public void onMessageReceived(RemoteMessage var1) {
  //your app is in background or foreground all time calling
}
Nadzieja pomaga. Powodzenia
 -3
Author: Erdal CEYLAN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 07:29:55