Làm việc kể từ tháng 7 năm 2019
Biên dịch AndroidSdkVersion 28, buildToolsVersion 28.0.3 và nhắn tin firebase: 19.0.1
Sau nhiều giờ nghiên cứu qua tất cả các câu hỏi và câu trả lời khác của StackOverflow và thử vô số giải pháp lỗi thời, giải pháp này đã quản lý để hiển thị thông báo trong 3 tình huống sau:
- Ứng dụng nằm ở phía trước:
thông báo được nhận bằng phương thức onMessageReceured tại lớp MyFirebaseMessagingService của tôi
- Ứng dụng đã bị tắt (nó không chạy ở chế độ nền):
thông báo được FCM tự động gửi đến khay thông báo. Khi người dùng chạm vào thông báo, ứng dụng sẽ được khởi chạy bằng cách gọi hoạt động có android.intent.c Category.LAUNCHER trong tệp kê khai. Bạn có thể lấy phần dữ liệu của thông báo bằng cách sử dụng getIntent (). GetExtras () tại phương thức onCreate ().
- Ứng dụng ở chế độ nền:
thông báo được FCM tự động gửi đến khay thông báo. Khi người dùng chạm vào thông báo, ứng dụng sẽ được đưa lên nền trước bằng cách khởi chạy hoạt động có android.intent.c Category.LAUNCHER trong tệp kê khai. Vì ứng dụng của tôi có launchMode = "singleTop" trong hoạt động đó, phương thức onCreate () không được gọi vì một hoạt động của cùng một lớp đã được tạo, thay vào đó phương thức onNewIntent () của lớp đó được gọi và bạn có được phần dữ liệu của thông báo ở đó bằng cách sử dụng aim.getExtras ().
Các bước: 1- Nếu bạn xác định hoạt động chính của ứng dụng như thế này:
<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- thêm các dòng này vào phương thức onCreate () của MainActivity. Class của bạn
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);
}
}
và các phương thức này cho cùng 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- tạo lớp MyFirebase như thế này:
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- tạo một lớp mới Thông báoActivity. Class như thế này:
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- Thêm các dòng này vào Ứng dụng của bạn, bên trong các thẻ của bạn
<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- thêm các dòng này trong phương thức Application.java onCreate () hoặc trong phương thức 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));
}
Làm xong.
Bây giờ để điều này hoạt động tốt trong 3 tình huống được đề cập, bạn phải gửi thông báo từ bảng điều khiển web Firebase theo cách sau:
Trong phần Thông báo: Tiêu đề thông báo = Tiêu đề để hiển thị trong hộp thoại thông báo (tùy chọn) Văn bản thông báo = Tin nhắn để hiển thị cho người dùng (bắt buộc) Sau đó, trong phần Mục tiêu: Ứng dụng = ứng dụng Android của bạn và trong phần Tùy chọn bổ sung: Kênh thông báo Android = default_channel_id Khóa dữ liệu tùy chỉnh: giá trị tiêu đề: (cùng văn bản ở đây so với trường Tiêu đề của phần Thông báo): giá trị cơ thể: (cùng văn bản ở đây so với trường Thông báo của phần Thông báo): click_action value: .MainActivity Sound =
Hết hạn sử dụng = 4 tuần
Bạn có thể gỡ lỗi nó trong Trình giả lập với API 28 bằng Google Play.
Chúc mừng mã hóa!
Not getting messages here? See why this may be: goo.gl/39bRNJ
. Giải pháp, giống như các câu trả lời dưới đây, có thể được tìm thấy trong tài liệu trong Tin nhắn có cả tải thông báo và tải dữ liệu