2016-11-21 11 views
7

Używam Firebase Cloud Messaging do dostarczania wiadomości z danymi do aplikacji, którą rozwijam. Według FCM Dokumentacji, gdy aplikacja jest na pierwszym planie:Firebase Cloud Messaging - Android: kliknięcie powiadomienia po zamknięciu aplikacji nie działa

Aplikacja klient otrzymuje wiadomość z danymi w onMessageReceived() i może obsługiwać pary klucz-wartość.

i działa dobrze. Gdy aplikacja działa w tle, zachowanie jest inne:

ładunek danych może zostać pobrany w intencji użytej do uruchomienia Twojej aktywności.

i wygląda na to, że nie działa dobrze. Używam parametru "click_action" w powiadomieniu JSON, w którym określam nazwę filtru zamiany używanego w Manifestu Androida w tagu "aktywność", który chcę otworzyć. Na przykład, moje zgłoszenie może być:

{ 
    "to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...", 
    "notification" : { 
     "body" : "This is a test", 
     "title" : "Test", 
     "click_action" : "com.test.click" 
    }, 
    "data" : { 
     "key" : "data" 
    } 
} 

A mój manifest ma ten intent-filtr, w „główną działalność”:

<intent-filter> 
    <action android:name="com.test.click" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 

Kiedy moja aplikacja jest w tle, a ja uruchomić powiadomienie, wszystko Wydaje się, że działa dobrze: klikam powiadomienie i wyświetlana jest prawidłowa aktywność, a klucze danych znajdują się w "dodatkach" odebranego zamiaru. Problem pojawia się, gdy moja aplikacja jest zamknięta: po dotknięciu powiadomienia aplikacja prawidłowo uruchamia się i otwiera działanie za pomocą filtru zamiaru "com.test.click", ale jeśli spróbuję wysłać kolejne powiadomienie, po dotknięciu na tym nic się nie dzieje, a powiadomienia w tle nie działają, dopóki nie uruchomię ponownie aplikacji.

Aby być bardziej jasne: powiadomienia działają dobrze, podczas gdy moja aplikacja jest na pierwszym planie lub w tle. Jeśli moja aplikacja jest zamknięta, pierwsze powiadomienie jest obsługiwane prawidłowo, ale każde inne powiadomienie w tle nie działa, dopóki nie zrestartuję aplikacji: jeśli kliknę powiadomienie, moja aplikacja wyświetli ostatnią aktywność obserwowaną, tak jakbym wybrała aplikację z menu "Ostatnie aplikacje". Jeśli zamknę i uruchomię ponownie aplikację, powiadomienia powrócą do prawidłowego działania.

Jest to błąd danych-wiadomości w Android lub FCM problem? Czy istnieje sposób na rozwiązanie tego problemu?

Do testowania używam interfejsu API Nexusa 5 23.

+1

Masz rozwiązanie tego problemu? – Bahu

+0

@Bahu Niestety nie, znalazłem rozwiązanie wykorzystujące tylko wiadomości danych, przy użyciu powiadomień w zasobniku systemowym błąd nadal istnieje. Myślę, że to błąd FCM. Czy eksperymentowałeś z tym samym błędem, który opisałem w moim pytaniu? –

+1

Tak, bracie, próbuję rozwiązać ten problem. Jeśli miałeś jakieś sugestie poza "wiadomościami z danymi, za pomocą powiadomień w zasobniku systemowym", proszę powiedz mi, – Bahu

Odpowiedz

8

postaram się opisać jak to działa w moim przypadku

przykład ładunku zgłoszenia:

{ 
"notification": { 
    "body": "This is a test message", 
    "title": "Message", 
    "click_action" : "OPEN_ACTIVITY_1" 
}, 
"data": { 
    "key": "test key" 

} 

przejawia się w działalności

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

Gdy aplikacja jest w tle lub zamknięte FCM utworzy "Komunikat powiadomienia" i onClick otworzy odpowiednią akcję, a następnie, aby obsłużyć powiadomienie, gdy aplikacja jest zamknięta, wywołaj getIntent() w onCreat e() metoda

np.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_hub); 

    handleIntents(getIntent()); //for simplicity I'm passing the value forward 


} 

Gdy aplikacja jest na pierwszym planie Tworzę powiadomienia niestandardowego w metodzie onMessageReceived na moim FirebaseMessagingService.

np.

Intent intent = new Intent(this, HubActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intent.putExtra("url", remoteMessage.getData().get("url")); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, 
      PendingIntent.FLAG_ONE_SHOT); 

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.ic_launcher) 
      .setContentTitle("Message") 
      .setContentText("This is a test message") 
      .setAutoCancel(true) 
      .setSound(defaultSoundUri) 
      .setContentIntent(pendingIntent); 

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

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); 

oraz poradzić odpowiednio aktywności mi zastąpienie metody onNewIntent (intent zamiaru).

np.

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 

    handleIntents(intent); //for simplicity I'm passing the value foward 


} 

więc to, co myślę, że brakowało jest onNewIntent (Intent intent), ponieważ obsługuje nowe zamiary, gdy działalność jest już utworzony.

Powiązane problemy