Bekerja pada Juli 2019
Android compileSdkVersion 28, buildToolsVersion 28.0.3 dan firebase-messaging: 19.0.1
Setelah berjam-jam meneliti semua pertanyaan dan jawaban StackOverflow lainnya, dan mencoba solusi usang yang tak terhitung jumlahnya, solusi ini berhasil menampilkan pemberitahuan dalam 3 skenario berikut:
- Aplikasi di latar depan:
pemberitahuan diterima oleh metode onMessageReceived di kelas MyFirebaseMessagingService saya
- Aplikasi telah terbunuh (tidak berjalan di latar):
notifikasi dikirim ke baki notifikasi secara otomatis oleh FCM. Ketika pengguna menyentuh pemberitahuan aplikasi diluncurkan dengan memanggil aktivitas yang memiliki android.intent.category.LAUNCHER di manifes. Anda bisa mendapatkan bagian data pemberitahuan dengan menggunakan getIntent (). GetExtras () di metode onCreate ().
- Aplikasi di latar belakang:
notifikasi dikirim ke baki notifikasi secara otomatis oleh FCM. Ketika pengguna menyentuh notifikasi, aplikasi dibawa ke latar depan dengan meluncurkan aktivitas yang memiliki android.intent.category.LAUNCHER di manifes. Karena aplikasi saya memiliki launchMode = "singleTop" dalam aktivitas itu, metode onCreate () tidak dipanggil karena satu aktivitas dari kelas yang sama sudah dibuat, sebaliknya metode onNewIntent () dari kelas itu dipanggil dan Anda mendapatkan bagian data dari pemberitahuan di sana dengan menggunakan intent.getExtras ().
Langkah-langkah: 1- Jika Anda mendefinisikan aktivitas utama aplikasi Anda seperti ini:
<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- tambahkan baris ini di metode onCreate () dari MainActivity.class Anda
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);
}
}
dan metode ini ke MainActivity.class yang sama:
@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- buat kelas MyFirebase seperti ini:
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- buat kelas baru NotificationActivity.class seperti ini:
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- Tambahkan baris ini ke manifes aplikasi Anda, di dalam tag Anda
<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- tambahkan baris ini dalam metode Application.java onCreate () Anda, atau dalam metode MainActivity.class onCreate ():
// 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));
}
Selesai
Sekarang agar ini berfungsi dengan baik dalam 3 skenario yang disebutkan, Anda harus mengirim pemberitahuan dari konsol web Firebase dengan cara berikut:
Di bagian Pemberitahuan: Judul Pemberitahuan = Judul untuk ditampilkan dalam dialog pemberitahuan (opsional) Teks pemberitahuan = Pesan untuk ditampilkan kepada pengguna (wajib) Kemudian di bagian Target: Aplikasi = aplikasi Android Anda dan di bagian Opsi Tambahan: Saluran Pemberitahuan Android = default_channel_id Kunci Data Kustom: nilai judul: (teks yang sama di sini daripada di bidang Judul di bagian Pemberitahuan) kunci: nilai tubuh: (teks yang sama di sini daripada di bidang Pesan di bagian Pemberitahuan) kunci: click_action value: .MainActivity Sound = Dinonaktifkan
Kedaluwarsa = 4 minggu
Anda dapat men-debug-nya di Emulator dengan API 28 dengan Google Play.
Selamat coding!
Not getting messages here? See why this may be: goo.gl/39bRNJ
. Solusinya, seperti jawaban di bawah ini, dapat ditemukan dalam dokumentasi di Pesan dengan notifikasi dan data payload