Arbeiten ab Juli 2019
Android compileSdkVersion 28, buildToolsVersion 28.0.3 und Firebase-Messaging: 19.0.1
Nach vielen, vielen Stunden Recherche durch alle anderen Fragen und Antworten von StackOverflow und dem Versuch unzähliger veralteter Lösungen gelang es dieser Lösung, Benachrichtigungen in diesen drei Szenarien anzuzeigen:
- App steht im Vordergrund:
Die Benachrichtigung wird von der onMessageReceived-Methode in meiner MyFirebaseMessagingService-Klasse empfangen
- Die App wurde beendet (sie wird nicht im Hintergrund ausgeführt):
Die Benachrichtigung wird von FCM automatisch an die Benachrichtigungsleiste gesendet. Wenn der Benutzer die Benachrichtigung berührt, wird die App gestartet, indem die Aktivität aufgerufen wird, deren Manifest android.intent.category.LAUNCHER enthält. Sie können den Datenteil der Benachrichtigung mit getIntent (). GetExtras () in der onCreate () -Methode abrufen.
- App befindet sich im Hintergrund:
Die Benachrichtigung wird von FCM automatisch an die Benachrichtigungsleiste gesendet. Wenn der Benutzer die Benachrichtigung berührt, wird die App in den Vordergrund gestellt, indem die Aktivität gestartet wird, deren Manifest android.intent.category.LAUNCHER enthält. Da meine App in dieser Aktivität launchMode = "singleTop" hat, wird die onCreate () -Methode nicht aufgerufen, da bereits eine Aktivität derselben Klasse erstellt wurde. Stattdessen wird die onNewIntent () -Methode dieser Klasse aufgerufen und Sie erhalten den Datenteil von die Benachrichtigung dort mit intent.getExtras ().
Schritte: 1- Wenn Sie die Hauptaktivität Ihrer App folgendermaßen definieren:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:largeHeap="true"
android:screenOrientation="portrait"
android:launchMode="singleTop">
<intent-filter>
<action android:name=".MainActivity" />
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
2- Fügen Sie diese Zeilen in der onCreate () -Methode Ihrer MainActivity.class hinzu
Intent i = getIntent();
Bundle extras = i.getExtras();
if (extras != null) {
for (String key : extras.keySet()) {
Object value = extras.get(key);
Log.d(Application.APPTAG, "Extras received at onCreate: Key: " + key + " Value: " + value);
}
String title = extras.getString("title");
String message = extras.getString("body");
if (message!=null && message.length()>0) {
getIntent().removeExtra("body");
showNotificationInADialog(title, message);
}
}
und diese Methoden zu derselben MainActivity.class:
@Override
public void onNewIntent(Intent intent){
//called when a new intent for this class is created.
// The main case is when the app was in background, a notification arrives to the tray, and the user touches the notification
super.onNewIntent(intent);
Log.d(Application.APPTAG, "onNewIntent - starting");
Bundle extras = intent.getExtras();
if (extras != null) {
for (String key : extras.keySet()) {
Object value = extras.get(key);
Log.d(Application.APPTAG, "Extras received at onNewIntent: Key: " + key + " Value: " + value);
}
String title = extras.getString("title");
String message = extras.getString("body");
if (message!=null && message.length()>0) {
getIntent().removeExtra("body");
showNotificationInADialog(title, message);
}
}
}
private void showNotificationInADialog(String title, String message) {
// show a dialog with the provided title and message
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(title);
builder.setMessage(message);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
3- Erstellen Sie die Klasse MyFirebase wie folgt:
package com.yourcompany.app;
import android.content.Intent;
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
public class MyFirebaseMessagingService extends FirebaseMessagingService {
public MyFirebaseMessagingService() {
super();
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d(Application.APPTAG, "myFirebaseMessagingService - onMessageReceived - message: " + remoteMessage);
Intent dialogIntent = new Intent(this, NotificationActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
dialogIntent.putExtra("msg", remoteMessage);
startActivity(dialogIntent);
}
}
4- Erstellen Sie eine neue Klasse NotificationActivity.class wie folgt:
package com.yourcompany.app;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.ContextThemeWrapper;
import com.google.firebase.messaging.RemoteMessage;
public class NotificationActivity extends AppCompatActivity {
private Activity context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this;
Bundle extras = getIntent().getExtras();
Log.d(Application.APPTAG, "NotificationActivity - onCreate - extras: " + extras);
if (extras == null) {
context.finish();
return;
}
RemoteMessage msg = (RemoteMessage) extras.get("msg");
if (msg == null) {
context.finish();
return;
}
RemoteMessage.Notification notification = msg.getNotification();
if (notification == null) {
context.finish();
return;
}
String dialogMessage;
try {
dialogMessage = notification.getBody();
} catch (Exception e){
context.finish();
return;
}
String dialogTitle = notification.getTitle();
if (dialogTitle == null || dialogTitle.length() == 0) {
dialogTitle = "";
}
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(context, R.style.myDialog));
builder.setTitle(dialogTitle);
builder.setMessage(dialogMessage);
builder.setPositiveButton(getResources().getString(R.string.accept), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
}}
5- Fügen Sie diese Zeilen zu Ihrem App-Manifest in Ihren Tags hinzu
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id"/>
<activity android:name=".NotificationActivity"
android:theme="@style/myDialog"> </activity>
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/notification_icon"/>
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/color_accent" />
6- Fügen Sie diese Zeilen in Ihre Application.java onCreate () -Methode oder in die MainActivity.class onCreate () -Methode ein:
// notifications channel creation
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Create channel to show notifications.
String channelId = getResources().getString("default_channel_id");
String channelName = getResources().getString("General announcements");
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(new NotificationChannel(channelId,
channelName, NotificationManager.IMPORTANCE_LOW));
}
Erledigt.
Damit dies in den drei genannten Szenarien gut funktioniert, müssen Sie die Benachrichtigung wie folgt von der Firebase-Webkonsole senden:
Im Abschnitt Benachrichtigung: Benachrichtigungstitel = Titel, der im Benachrichtigungsdialog angezeigt werden soll (optional) Benachrichtigungstext = Nachricht, die dem Benutzer angezeigt werden soll (erforderlich) Dann im Abschnitt Ziel: App = Ihre Android-App und im Abschnitt Zusätzliche Optionen: Android-Benachrichtigungskanal = default_channel_id Benutzerdefinierter Datenschlüssel: Titelwert: (gleicher Text hier als im Feld Titel des Benachrichtigungsabschnitts) Schlüssel: Textwert: (gleicher Text hier als im Nachrichtenfeld des Benachrichtigungsabschnitts) Schlüssel: click_action-Wert: .MainActivity Sound = Deaktiviert
läuft ab = 4 Wochen
Sie können es im Emulator mit API 28 mit Google Play debuggen.
Viel Spaß beim Codieren!
Not getting messages here? See why this may be: goo.gl/39bRNJ
. Die Lösung, wie die folgenden Antworten, finden Sie in der Dokumentation in Nachrichten mit Benachrichtigung und Datennutzdaten