Firebase 云消息服务 - 即使应用程序被杀死也能接收通知
Posted
技术标签:
【中文标题】Firebase 云消息服务 - 即使应用程序被杀死也能接收通知【英文标题】:Firebase Cloud Messaging Service - Receive Notifications even when app is killed 【发布时间】:2016-09-08 09:43:13 【问题描述】:如果android应用被用户或Android故意杀死,FirebaseMessagingService
在收到消息时会检测到通知吗?
我已经杀死了我的应用,然后从 Firebase 控制台发送了一条消息。我无法收到通知。有没有办法即使应用程序被杀死也能收到通知。
public class YumigoBidMessagingService extends FirebaseMessagingService
private static final String TAG = YumigoBidMessagingService.class.getSimpleName();
/**
* Called when message is received.
*
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
*/
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage)
// [START_EXCLUDE]
// There are two types of messages data messages and notification messages. Data messages are handled
// here in onMessageReceived whether the app is in the foreground or background. Data messages are the type
// traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app
// is in the foreground. When the app is in the background an automatically generated notification is displayed.
// When the user taps on the notification they are returned to the app. Messages containing both notification
// and data payloads are treated as notification messages. The Firebase console always sends notification
// messages.
// [END_EXCLUDE]
// TODO(developer): Handle FCM messages here.
// Not getting messages here? See why this may be:
Log.d(TAG, "From: " + remoteMessage.getFrom());
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0)
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null)
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
sendNotification(remoteMessage.getData()+"");
// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.
/**
* Create and show a simple notification containing the received FCM message.
*
* @param messageBody FCM message body received.
*/
private void sendNotification(String messageBody)
Intent intent = new Intent(this, BiddingActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
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_stat_ic_notification)
.setContentTitle("Bid Received")
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setPriority(Notification.PRIORITY_HIGH)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
【问题讨论】:
使用您的设备令牌尝试单个设备 我试过了,然后只有我发帖了。当我杀死我的应用程序时,我没有收到任何通知。但是,当我的应用在系统托盘中时,我会收到通知 你的设备令牌的 bcz 上传您的 FCM 服务代码。 @mayank,你能成功吗? (手动申请后收到通知)因为我面临同样的问题并且没有任何线索。 【参考方案1】:如果应用程序被杀死/强制停止,如上面链接中的answer 所述:
强制停止是完全终止应用程序 - 所有进程都被终止,所有服务停止,所有通知被移除,所有警报被移除,等等。
这将导致该应用根本收不到任何通知,因为它是从 3.1 版开始为 Android 设计的,如 answer 中所述:
处于停止状态的应用不会收到广播 Intent。
停止状态是:
最初安装应用时(在用户在应用中运行某些内容之前)或 强制停止后。 你可以在这里找到更多信息:http://developer.android.com/about/versions/android-3.1.html#launchcontrols
只是从我的答案here 中检索到的一部分。查看帖子,它也可能对您有所帮助。
【讨论】:
那么有没有办法可以实现这一点,因为我需要设备接收通知。我的意思是 whatsapp、facebook 和其他新闻提要应用程序正在这样做,所以应该有一些或其他方式 我不完全确定,因为我以前没有尝试过。但是,我想我之前在某处读过使用START_STICKY 会有所帮助的地方。在社区周围搜索。谷歌周围。我很确定这是这里的常见问题。 :)【参考方案2】:您可以使用 FCM 发送两种类型的消息,即通知或数据消息。
您发送的是通知消息,如果应用程序在后台,则会将其发送到系统托盘,而不是您的 onMessageRecieved() 回调。
尝试使用数据消息,在这种情况下,您将始终在 onMessageRecieved() 回调中收到通知,您可以根据需要进行处理,而不是依赖系统托盘。
【讨论】:
我已经杀死了我的应用程序。没有它的例子。 onMessageReceived 不起作用。该应用程序不在后台。它被完全杀死 如前所述,即使应用程序被完全杀死,MessagingService 也会在发送 Data Message 时变为活动状态。 简单有效的解决方案!即使应用程序关闭也可以工作。也许在重新启动设备后它将无法工作,直到应用程序启动一次 - 但在这种情况下,添加一个带有“ACTION_BOOT_COMPLETED”的“BroadcastReceiver”可能会有所帮助。 @rpattabi 以及它在哪里明确提到?我正在发送数据消息,但这不起作用...请为您的声明提供参考 @rpattabi 这不是我的情况。当我后台应用程序并发送一条数据消息时,它由我的 FirebaseMessagingService 中的 onMessageReceived() 接收(有趣的是,它是为每条消息创建然后销毁的)。当我终止应用程序(通过从打开的应用程序列表滑动)时,onMessageReceived() 中不再收到消息。我在不同制造商的几台设备上观察到了这种行为。【参考方案3】:简而言之,要唤醒您被杀死的应用程序,您应该始终发送通知 data
对象 以调用您的通知服务类处理程序 FirebaseMessagingService.onMessageReceived() 在您的应用。
也尝试不是从 Firebase 控制台发送它,而是从其他地方发布它(例如在线测试发布服务)。
【讨论】:
以上是关于Firebase 云消息服务 - 即使应用程序被杀死也能接收通知的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 云消息传递的 AbstractMethodError
FCM 检测 IOS 上的应用程序卸载(firebase 云消息推送通知)