当前位置: 首页 > 知识库问答 >
问题:

在Firebase节点更新时接收通知

漆雕皓轩
2023-03-14

我有两个应用程序,一个客户预订应用程序和一个管理接收器应用程序。它们都连接到同一个Firebase数据库。当客户预订时,我可以在我的管理应用程序中查看。但是,我如何使它,以便我收到通知,在管理应用程序,一旦预订是在客户应用程序?

我已经找到了这段代码,但我如何实现它,使它显示的通知,即使管理应用程序没有打开?

 Uri notificationSoundURI = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder mNotificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(subject)
            .setContentText(object.getString("body"))
            .setAutoCancel(true)
            .setSound(notificationSoundURI)
            .setContentIntent(resultIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0, mNotificationBuilder.build());

    ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, ToneGenerator.MAX_VOLUME);
    toneG.startTone(ToneGenerator.TONE_CDMA_HIGH_L, 3000);
    ((Vibrator)getSystemService(VIBRATOR_SERVICE)).vibrate(2000);

我的Firebase树看起来像这样

{
"Bookings",
"UserID Appears here",
"User booking info appears here"}
}

bookings节点是一个常量,并且始终存在,一旦进行了预订,用户id就会出现。我可以有某种服务,即使在应用程序关闭时运行,监听“userid”节点更新?然后开火上面的通知方法?我从未使用过通知和服务。

共有2个答案

裴学
2023-03-14

这是云功能和Firebase云消息传递的典型用例。事实上,这种场景非常常见,以至于在Firebase文档中有一个示例,名为:当某些有趣的事情发生时通知用户

云功能允许您通过在Google的服务器上运行(node.js)代码来响应Firebase项目中的事件。由于这段代码运行在谷歌的服务器上,所以即使在应用程序不活动的情况下,它也会是活动的。然后,这段代码可以使用Firebase Admin SDK来调用其他Firebase服务,比如这里的云消息传递。

Firebase Cloud Messaging允许您向安装在设备上的应用程序发送消息,即使该应用程序未被积极使用。您通常使用问题中的代码来响应接收到这样的消息,然后在该设备上显示本地通知。然后,当用户单击通知时,您打开应用程序,并使用实时数据库API从服务器读取(其余的)数据

有关此方面的更多信息,请参阅:

  • 关闭应用程序时侦听firebase数据库更改
  • 在Android和FCM后台时处理keepSynced()
  • 如何使用Firebase消息传递发送一对一消息
  • 许多关于云消息和后台侦听器的搜索结果。
白晋鹏
2023-03-14

管理应用程序的代码

// Minimal Fcm Service
class FcmService : FirebaseMessagingService() {
    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        remoteMessage.data.isNotEmpty().let {
            // data message, handle it or start a service
            Intent(this, ConnectionService::class.java).also { intent -> startService(intent) }
        }

        remoteMessage.notification?.let {
        // notification message, you can define your custom notification here or just leave it that way
        }
    }
}

这就是你在舱单上注册的方式

<service
    android:name="com.yourpackage.appname.FcmService"
    android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
</service>

编辑:

通知消息:

FCM代表客户端应用程序自动向最终用户设备显示消息。通知消息具有一组预定义的用户可见键和一个自定义键-值对的可选数据负载。

数据电文:

客户端app负责处理数据消息。数据消息只有自定义键值对。

编辑二:Java代码

public class FcmService extends FcmService {
    @Override
    public void onMessageReceived(@NotNull RemoteMessage remoteMessage) {
        if (!remoteMessage.getData().isEmpty()){
            // data message
            // start a service or handle it the way you want
        }
        
        if (remoteMessage.getNotification() != null){
            // notification message
        }
    }
}

连接到Java的Fcm官方服务

 类似资料:
  • 如果触发了多个通知,那么由于NOTIFICATION_ID是相同的,所以它不会更新。 有没有办法知道有多少通知被激发了?以便我可以相应地更新我的通知。 我不想单独发出通知。我想更新现有的通知。在这里,我只需要计算出在触发通知时已经触发的通知数。当用户点击它时,该号码应该重置。

  • 我正在玩一个链接列表类项目的指针,我不知道如何创建到新节点的链接。我有一个类,它包含像这样的方法来操作数据结构。我希望这些节点是从csv文件中读取的出价。 当我从CSV加载所有数据时,我想 创建一个新的出价 将新的出价传递给函数 设置Bid对象的nextBid指针,并更新链接列表的尾部 我将不胜感激为每个出价对象创建新地址的任何指针,因为现在尾节点只'记得'第一个出价的地址。 我复制了下面的代码,

  • firebase中我的数据库截图 这里我有一个叫做产品的节点。在那里,我有许多子节点。所有这些节点都有一个共同的值叫做产品库存。我需要更新产品内部所有节点的产品库存值。我如何在android Studio(Java)中做到这一点,因为我正在开发一个购物应用程序?需要帮助。 流程是:用户将产品添加到购物车。在购物车里,我有ordernow按钮。因此,当用户现在单击order时,应该从products

  • 我正在尝试按顺序逐个删除窗格中的所有节点,以便可以看到每一行被删除。为此,我创建了一个新线程,使用task类,并将方法delWalls()包装在一个平台中。runLater()。然后我用了线。睡眠会让循环变慢,这样当每一行被删除时,我就可以看到UI更新了,但是发生的是整个UI冻结,然后循环完成后,所有节点都消失了?有办法解决这个问题吗。。。谢谢 *所有节点都是线顺便说一句 //delWalls方法

  • SyntaxError:无效输入“h”:预期为“I/I”(第10行,第28列(偏移量:346))“merge(p:primaryconsumer),其中p.name=svc.name” 我100%确信这些名称是唯一的,并且将与现有节点集中的唯一使用者名称相匹配(有待观察)。 当唯一节点属性匹配时,如何将现有属性添加到新数据中?(我希望获得唯一的ID,但我必须能够在匹配上执行新数据的更新)

  • null 我遵循Xamarin的文档实现了这个功能。 然后一步一步地执行,直到下面的部分: 后台通知 我点击了Log Token按钮并收到了令牌。 null Firebase控制台显示消息为“完成”。 我错过了什么来解决这个问题?