我正在使用Firebase向我的应用发送推送通知。我的应用支持直到 API 级别 27.我正在使用 FirebaseMessagingService 来接收通知。在 onMessageReceived() 方法中,我正在获取数据有效负载并在托盘中创建自己的通知。从控制台我只发送数据有效负载,因为我不希望应用程序在后台创建系统通知。现在,当应用程序处于前台和后台时,我可以在onMessageReceived()中获取回调。但问题是当应用程序从内存中清除(或被杀死)时,它不会被调用。当我的应用被终止时,如何在 onMessageReceived 中获取回调?
清单.xml
<service android:name=".service.MyFirebaseInstanceIdService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service android:name=".service.FcmMessagingService">
<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="promotions" />
Fcm消息服务.java
public class FcmMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
if (remoteMessage == null)
return;
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Logger.v(Logger.TAG, "Notification Body: " + remoteMessage.getNotification().getBody());
}
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Logger.v(Logger.TAG, "Data Payload: " + remoteMessage.getData().toString());
try {
//JSONObject json = new JSONObject(remoteMessage.getData().toString());
NotificationHandler.handleNotification(this, formNotificationObject(null));
} catch (Exception e) {
Logger.e(Logger.TAG, "Exception: " + e.getMessage());
}
}
}
private Notification formNotificationObject(JSONObject data) {
//creating notifcation object here
}
build.gradle
compile "com.google.firebase:firebase-messaging:11.4.2"
compile 'com.facebook.android:facebook-android-sdk:4.29.0'
compile "com.android.support:appcompat-v7:26.0.0"
有效载荷
{
"to": "cogzTKfWsXI:APA9................plSjNu",
"mutable_content": false,
"time_to_live": 20,
"data": {
"messageid": 10,
"title": "Test",
"body": "Testing",
"image": "",
"expiry": "2018-11-13 11:35:11"
}
}
如果您在"Firebase 控制台 - 通知编辑器"中发送消息,则始终在前台使用。
有两种类型的消息。
- 通知消息
- 数据电文
对于通知消息,它仅在前台处理。 但在数据消息的情况下,可以在后台处理它。
通过"Firebase 控制台 - 通知"发送消息,表示消息类型为"通知消息"。
如果要发送数据消息类型,则应使用 Firebase Cloud Functions 或其他功能。
您可以查看以下链接: https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages
而这个链接:https://firebase.google.com/docs/cloud-messaging/android/receive#handling_messages
Android应用由不同的活动和服务组成,Android 区分应用的停止状态和活动的停止状态。当用户从最近的应用列表中将应用从内存中轻扫时,活动将停止。另一方面,应用程序在以下情况下处于停止状态:
- 首次安装但尚未启动,并且
- 当用户在"管理应用程序"源中手动停止它们时
问题所在
由于一些Android手机制造商误解了此规范(请参阅此和此规范),当应用程序从"最近"视图中滑动时,将应用程序置于停止状态,因此似乎无法可靠地将推送通知发送到所有Android设备,除非您是WhatsApp,Gmail,Twitter等,并且已被这些制造商列入白名单。
修复
最终结果是,有许多特定于设备和操作系统版本的因素会影响我们的应用程序推送通知的可交付性。要尝试的事情:
在 Android X 至 7.1 版上,启用自动启动:设置>安全>权限>自动启动
在 Android 8.0 上,自动启动选项已被移除,因此现在您可以转到电池>>电池优化>设置(左上角的三个点菜单) 高级优化> 关闭高级优化